Opengl 我是否需要注意将顶点属性打包在一起?
如果我想将两个名义上独立的浮点属性数组传递给一个draw调用,我是否可以为每个浮点属性调用一个GLSLOpengl 我是否需要注意将顶点属性打包在一起?,opengl,glsl,Opengl,Glsl,如果我想将两个名义上独立的浮点属性数组传递给一个draw调用,我是否可以为每个浮点属性调用一个GLSLin float变量,或者我是否需要确保将它们打包到一个in vec2或类似属性中,并使用各种组件确保不消耗不必要的GL_MAX_VERTEX_ATTRIBS“插槽”? 或者,换句话说GL_MAX_VERTEX_ATTRIBS根据文档指定“顶点着色器可访问的四分量通用顶点属性的最大数量”。小于4个组件的属性是否始终作为一个属性计入该限制 小于4个组件的属性是否始终作为一个属性计入该限制 是的,这
in float
变量,或者我是否需要确保将它们打包到一个in vec2
或类似属性中,并使用各种组件确保不消耗不必要的GL_MAX_VERTEX_ATTRIBS
“插槽”?
或者,换句话说GL_MAX_VERTEX_ATTRIBS
根据文档指定“顶点着色器可访问的四分量通用顶点属性的最大数量”。小于4个组件的属性是否始终作为一个属性计入该限制
小于4个组件的属性是否始终作为一个属性计入该限制
是的,这正是它的意思
每个顶点属性都是4分量的,如果您在着色器中将其作为float
写入,实际上不会改变任何内容。如果您希望看到此操作,请尝试设置一个单分量顶点属性指针,然后在顶点着色器中声明属性vec4
——GL将分别为y
、z
和w
自动分配值0.0、0.0、1.0
如果您使用的是一组标量,则命中顶点属性限制(最小值16),那么您应该考虑将属性打包成<代码> VEC4<代码>,而不是最佳使用。
对于包含4个以上组件的数据类型(例如
mat4
),上述规则有一个小的例外。声明的顶点属性mat4
有16个组件,并使用4个连续属性位置。谢谢您的回答!不过,人们可以想象,司机可以在幕后围绕这一限制进行优化;你知道有没有什么特别的原因让他们不知道吗?@Dolda2000:gpu传统上是围绕四分量向量和向量运算设计的。如今,GPU对标量更加友好,但这种限制甚至适用于一些较旧GPU上的制服。GLSL定义了顶点着色器需要支持的最小数量的统一组件,但一些GPU将任何少于4个组件的统一视为使用4个组件——据我所知,这是因为它们没有标量寄存器。@Dolda2000:来自原始(GLSL之前的日期):为了定义这样的顶点程序,此扩展定义了一个顶点编程模型,包括一个浮点4分量向量指令集和一组相对较大的浮点4分量寄存器