Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 我是否需要注意将顶点属性打包在一起?_Opengl_Glsl - Fatal编程技术网

Opengl 我是否需要注意将顶点属性打包在一起?

Opengl 我是否需要注意将顶点属性打包在一起?,opengl,glsl,Opengl,Glsl,如果我想将两个名义上独立的浮点属性数组传递给一个draw调用,我是否可以为每个浮点属性调用一个GLSLin float变量,或者我是否需要确保将它们打包到一个in vec2或类似属性中,并使用各种组件确保不消耗不必要的GL_MAX_VERTEX_ATTRIBS“插槽”? 或者,换句话说GL_MAX_VERTEX_ATTRIBS根据文档指定“顶点着色器可访问的四分量通用顶点属性的最大数量”。小于4个组件的属性是否始终作为一个属性计入该限制 小于4个组件的属性是否始终作为一个属性计入该限制 是的,这

如果我想将两个名义上独立的浮点属性数组传递给一个draw调用,我是否可以为每个浮点属性调用一个GLSL
in float
变量,或者我是否需要确保将它们打包到一个
in vec2
或类似属性中,并使用各种组件确保不消耗不必要的
GL_MAX_VERTEX_ATTRIBS
“插槽”?

或者,换句话说
GL_MAX_VERTEX_ATTRIBS
根据文档指定“顶点着色器可访问的四分量通用顶点属性的最大数量”。小于4个组件的属性是否始终作为一个属性计入该限制

小于4个组件的属性是否始终作为一个属性计入该限制

是的,这正是它的意思

每个顶点属性都是4分量的,如果您在着色器中将其作为
float
写入,实际上不会改变任何内容。如果您希望看到此操作,请尝试设置一个单分量顶点属性指针,然后在顶点着色器中声明属性
vec4
——GL将分别为
y
z
w
自动分配值0.00.01.0

如果您使用的是一组标量,则命中顶点属性限制(最小值16),那么您应该考虑将属性打包成<代码> VEC4<代码>,而不是最佳使用。


对于包含4个以上组件的数据类型(例如
mat4
),上述规则有一个小的例外。声明的顶点属性
mat4
有16个组件,并使用4个连续属性位置。

谢谢您的回答!不过,人们可以想象,司机可以在幕后围绕这一限制进行优化;你知道有没有什么特别的原因让他们不知道吗?@Dolda2000:gpu传统上是围绕四分量向量和向量运算设计的。如今,GPU对标量更加友好,但这种限制甚至适用于一些较旧GPU上的制服。GLSL定义了顶点着色器需要支持的最小数量的统一组件,但一些GPU将任何少于4个组件的统一视为使用4个组件——据我所知,这是因为它们没有标量寄存器。@Dolda2000:来自原始(GLSL之前的日期):为了定义这样的顶点程序,此扩展定义了一个顶点编程模型,包括一个浮点4分量向量指令集和一组相对较大的浮点4分量寄存器