关于glVertexAttrib ...函数的困惑

关于glVertexAttrib ...函数的困惑

简介经过大量搜索,我仍然对<code>glVertexAttrib...</code>函数(<code>glVertexAttrib1d</code>,<code>glVertexAttrib1f</code>等�

经过大量搜索,我仍然对glVertexAttrib...函数(glVertexAttrib1dglVertexAttrib1f等)的用途及其用途感到困惑。

通过阅读this questiondocumentation,我目前的理解是,它们的目的是以某种方式将顶点属性设置为常量(即,不使用数组缓冲区)。但是文档还讨论了它们如何与“通用顶点属性”进行交互,这些属性定义如下:

  

通用属性定义为四个组成数组的值。该数组的第一个条目编号为0,并且数组的大小由与实现相关的常量GL_MAX_VERTEX_ATTRIBS指定。可以通过glVertexAttrib调用修改该数组的各个元素,该调用指定要修改的元素的索引以及该元素的值。

它说它们都是“四分量值”,但是完全有可能比顶点属性中的分量多或少。

这到底是什么意思?这仅适用于vec4类型吗? “通用顶点属性”的索引是什么?明确的解释可能是我真正需要的。

最佳答案:

1 个答案:

答案 0 :(得分:3)

在OpenGL中,顶点被指定为一组顶点属性。随着可编程plepleine的问世,您有责任编写自己的顶点处理功能。顶点着色器确实处理一个顶点,并获取此特定顶点的属性作为输入。

这些顶点属性称为通用顶点属性,因为它们的含义完全由您作为应用程序程序员定义(与传统的固定功能管道相反,在传统的固定功能管道中,属性集完全由GL)。

OpenGL规范要求实现者支持至少16个不同的顶点属性。因此,每个顶点属性都可以通过其 index 从0到15进行标识(或您的实现允许的任何限制,请参见glGet(GL_MAX_VERTEX_ATTRIBS,...))。

概念上将顶点属性视为四维向量。当您在着色器中使用的少于vec4时,其他元素将被忽略。如果您指定少于四个元素,则矢量始终填充到(0,0,0,1)中,这对于RGBA颜色矢量以及同质的顶点坐标都是有意义的。

尽管您可以声明mat类型的顶点属性,但这将被映射到许多连续的顶点属性索引。

顶点属性数据可以来自一个顶点数组(如今,它们必须位于一个Vertex Buffer Object中,可能直接位于VRAM中,在旧式GL中,它们也可能来自普通客户端地址空间)或来自该属性的当前值。 您可以通过glEnableVertexAttribArray启用从属性数组的获取。如果启用了您在顶点着色器中访问的特定属性的顶点数组,GPU将从该文件中获取第 i 个元素在处理顶点 i 时。对于您访问的所有其他属性,您将获得该数组的当前值

当前值可以通过glVertexAttrib[1234]*系列GL函数进行设置。在绘制调用期间无法更改它们,因此它们在整个绘制调用期间保持不变 ,就像统一变量一样。

值得注意的重要一点是,默认情况下,顶点属性始终是浮点,因此您必须在顶点中声明in float / vec2 / vec3 / vec4着色器可以访问它们。例如,使用glVertexAttrib4ubv或使用GL_UNISGNED_BYTE作为glVertexAttribPointertype参数来设置当前值不会改变此设置。数据将自动转换为浮点数。

如今,GL确实支持其他两种属性数据类型:32位整数和64位双精度浮点值。您必须在着色器中分别将它们声明为int / ivec*uint / uvec*double / dvec*,并且您必须在设置数组指针或当前值时使用完全独立的函数:glVertexAttribIPointerglVertexAttribI*用于有符号/无符号整数和 glVertexAttribLPointerglVertexAttribL*代表双打(“长浮点数”)。

Tags:OpenGL 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Matlab中,你可以使用自定义函数来提高代码的模块性和重复利用率。你可以通过以下步骤来定义一个函数: 1. 使用Matlab编辑器创建一个新的脚本文件,文件的名称应与函数的名称相匹配。 2. 在脚本文件中使用`function`关键字来定义函数函数定义的一般格式是:`function [输出变量] = 函数名(输入变量)` 3. 在函数体内编写函数的逻辑和操作,包括任何输入参数的处理和计算。 4. 如果有输出变量,使用`return`关键字来返回结果。 5. 保存脚本文件,并确保文件名与函数名一致。 在定义函数后,你可以在Matlab命令窗口或其他脚本文件中调用该函数。调用函数的一般格式是:`函数名(输入参数)`。Matlab将在调用函数时执行函数体内的代码,并返回结果。 总结:在Matlab中,你可以使用自定义函数来提高代码的模块性和重复利用率。定义函数的步骤包括创建脚本文件、使用`function`关键字定义函数、编写函数体和保存文件。调用函数的步骤包括使用函数名和输入参数来调用函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [matlab 定义函数,matlab定义函数并调用](https://blog.csdn.net/weixin_32950759/article/details/116513658)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值