GLSL将4个浮点属性打包成vec4

时间:2014-02-10 11:44:27

标签: opengl attributes glsl

我对glsl中属性float的资源消耗有疑问。

是否需要尽可能多的资源vec4,或者没有?

我问这个,因为制服需要https://stackoverflow.com/a/20775024/1559666(至少,他们可以)

如果不是,那么将4 float打包成一个vec4属性是否合理?

2 个答案:

答案 0 :(得分:2)

是的, 所有 顶点属性需要一些4分量矢量的多个用于存储。

这意味着float顶点属性需要1个广告位,与vec2vec3vec4相同。大于vec4的类型需要多个插槽。 mat4顶点属性需要4 x vec4个存储单元。 dvec4(双精度矢量)顶点属性需要2 x vec4。由于实现只需要提供16个唯一的顶点属性槽,如果您天真地使用单个float属性,您可以轻松耗尽所有可用存储空间来存储4x4矩阵。

没有解决这个问题。与制服(标量GPU可能比float更有效地存储vec4制服)不同,属性始终与4分量数据类型相关联。因此对于顶点属性,将属性打包到向量中非常重要。


我已更新我的答案,指出GL和GLSL规范的相关摘录:

OpenGL 4.4 Core Profile Specification - 10.2.1当前通用属性 - 第307页

  

顶点着色器(参见第11.1节)访问一个4分量通用顶点数组   属性。该数组的第一个插槽编号为零,数组的大小为   由依赖于实现的常量 GL_MAX_VERTEX_ATTRIBS 指定。

GLSL 4.40 Specification - 4.4.1输入布局限定符 - 第60页

  

如果顶点着色器输入是任何标量或矢量类型,则它将使用单个位置。如果非顶点着色器输入是 dvec3 dvec4 以外的标量或矢量类型,则它将使用单个位置,而类型 dvec3 dvec4 将消耗两个连续的位置。类型 double dvec2 的输入在所有阶段中仅消耗一个位置。

不可否认,dvec4描述的行为略有不同。在GL_ARB_vertex_attrib_64bit形式中,双精度类型可能会占用两倍于浮点的存储空间,因此dvec3dvec4可能会占用两个属性槽。当它被提升为核心时,该行为发生了变化......它们只是假设在顶点阶段消耗1个位置,可能在任何其他阶段更多。

双精度矢量类型的原始(扩展)行为:

  

命名

     
    

ARB_vertex_attrib_64bit

         
      

[...]

             

此外,一些顶点着色器输入使用更宽的64位组件           对于数量的依赖于实现的限制,可能会计入两倍           顶点着色器属性向量。 64位标量或双组分           vector只消耗一个通用顶点属性;三和           四分量“长”可以算作两个。这种方法类似于           在当前GL中使用的矩阵属性消耗多个           属性。

    
  

答案 1 :(得分:0)

属性vec4将占用属性float的4倍内存。 在制服上,由于某些对齐,您可能会丢失一些组件。 (vec4将与4个字节对齐)。