GLSL packing 4 float attributes into vec4

邮差的信 提交于 2019-12-11 01:44:44

问题


I have a question about resource consumption of attribute float in glsl.

Does it take as many resources as vec4, or no?

I ask this, because uniforms takes https://stackoverflow.com/a/20775024/1559666 (at least, they could)

If it is not, then does it makes any sense to pack 4 float's into one vec4 attribute?


回答1:


Yes, all vertex attributes require some multiple of a 4-component vector for storage.

This means that a float vertex attribute takes 1 slot the same as a vec2, vec3 or vec4 would. And types larger than vec4 take multiple slots. A mat4 vertex attribute takes 4 x vec4 many units of storage. A dvec4 (double-precision vector) vertex attribute takes 2 x vec4. Since implementations are only required to offer 16 unique vertex attribute slots, if you naively used single float attributes, you could easily exhaust all available storage just to store a 4x4 matrix.

There is no getting around this. Unlike uniforms (scalar GPUs may be able to store float uniforms more efficiently than vec4), attributes are always tied to a 4-component data type. So for vertex attributes, packing attributes into vectors is quite important.


I have updated my answer to point out relevant excerpts from the GL and GLSL specifications:

OpenGL 4.4 Core Profile Specification - 10.2.1 Current Generic Attributes - pp. 307

Vertex shaders (see section 11.1) access an array of 4-component generic vertex attributes. The first slot of this array is numbered zero, and the size of the array is specified by the implementation-dependent constant GL_MAX_VERTEX_ATTRIBS.

GLSL 4.40 Specification - 4.4.1 Input Layout Qualifiers - pp. 60

If a vertex shader input is any scalar or vector type, it will consume a single location. If a non-vertex shader input is a scalar or vector type other than dvec3 or dvec4, it will consume a single location, while types dvec3 or dvec4 will consume two consecutive locations. Inputs of type double and dvec2 will consume only a single location, in all stages.

Admittedly, the behavior described for dvec4 differs slightly. In GL_ARB_vertex_attrib_64bit form, double-precision types may consume twice as much storage as floating-point, such that a dvec3 or dvec4 may consume two attribute slots. When it was promoted to core, that behavior changed... they are only supposed to consume 1 location in the vertex stage, potentially more in any other stage.

Original (extension) behaviour of double-precision vector types:

Name

ARB_vertex_attrib_64bit

[...]

Additionally, some vertex shader inputs using the wider 64-bit components may count double against the implementation-dependent limit on the number of vertex shader attribute vectors. A 64-bit scalar or a two-component vector consumes only a single generic vertex attribute; three- and four-component "long" may count as two. This approach is similar to the one used in the current GL where matrix attributes consume multiple attributes.




回答2:


The attribute vec4 will take 4 times the memory of the attribute float. On uniforms, due to some alignments, you may loose some components. (vec4 will be aligned to 4 bytes).



来源:https://stackoverflow.com/questions/21676280/glsl-packing-4-float-attributes-into-vec4

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!