我对glsl中属性float
的资源消耗有疑问。
是否需要尽可能多的资源vec4
,或者没有?
我问这个,因为制服需要https://stackoverflow.com/a/20775024/1559666(至少,他们可以)
如果不是,那么将4 float
打包成一个vec4
属性是否合理?
答案 0 :(得分:2)
是的, 所有 顶点属性需要一些4分量矢量的多个用于存储。
这意味着float
顶点属性需要1个广告位,与vec2
,vec3
或vec4
相同。大于vec4
的类型需要多个插槽。 mat4
顶点属性需要4 x vec4
个存储单元。 dvec4
(双精度矢量)顶点属性需要2 x vec4
。由于实现只需要提供16个唯一的顶点属性槽,如果您天真地使用单个float
属性,您可以轻松耗尽所有可用存储空间来存储4x4矩阵。
没有解决这个问题。与制服(标量GPU可能比float
更有效地存储vec4
制服)不同,属性始终与4分量数据类型相关联。因此对于顶点属性,将属性打包到向量中非常重要。
我已更新我的答案,指出GL和GLSL规范的相关摘录:
顶点着色器(参见第11.1节)访问一个4分量通用顶点数组 属性。该数组的第一个插槽编号为零,数组的大小为 由依赖于实现的常量
GL_MAX_VERTEX_ATTRIBS
指定。
如果顶点着色器输入是任何标量或矢量类型,则它将使用单个位置。如果非顶点着色器输入是
dvec3
或dvec4
以外的标量或矢量类型,则它将使用单个位置,而类型dvec3
或dvec4
将消耗两个连续的位置。类型double
和dvec2
的输入在所有阶段中仅消耗一个位置。
不可否认,dvec4
描述的行为略有不同。在GL_ARB_vertex_attrib_64bit
形式中,双精度类型可能会占用两倍于浮点的存储空间,因此dvec3
或dvec4
可能会占用两个属性槽。当它被提升为核心时,该行为发生了变化......它们只是假设在顶点阶段消耗1个位置,可能在任何其他阶段更多。
命名强>
ARB_vertex_attrib_64bit
[...]
此外,一些顶点着色器输入使用更宽的64位组件 对于数量的依赖于实现的限制,可能会计入两倍 顶点着色器属性向量。 64位标量或双组分 vector只消耗一个通用顶点属性;三和 四分量“长”可以算作两个。这种方法类似于 在当前GL中使用的矩阵属性消耗多个 属性。
答案 1 :(得分:0)
属性vec4将占用属性float的4倍内存。 在制服上,由于某些对齐,您可能会丢失一些组件。 (vec4将与4个字节对齐)。