opengl attributes glsl

opengl - GLSL tiene 4 atributos de flotación en vec4



attributes (2)

Tengo una pregunta sobre el consumo de recursos del atributo float en glsl.

¿Toma tantos recursos como vec4 , o no?

Pregunto esto, porque los uniformes llevan https://stackoverflow.com/a/20775024/1559666 (al menos, podrían)

Si no es así, ¿tiene sentido empaquetar 4 float en un atributo vec4 ?


El atributo vec4 tomará 4 veces la memoria del atributo float. En los uniformes, debido a algunas alineaciones, puede perder algunos componentes. (vec4 estará alineado a 4 bytes).


Sí, todos los atributos de vértice requieren algún múltiplo de un vector de 4 componentes para el almacenamiento.

Esto significa que un atributo de vértice float toma 1 ranura de la misma manera que lo vec2 un vec2 , vec3 o vec4 . Y los tipos más grandes que vec4 toman múltiples ranuras. Un mat4 vértice mat4 toma 4 x vec4 muchas unidades de almacenamiento. Un atributo de vértice dvec4 (vector de precisión doble) toma 2 x vec4 . Dado que las implementaciones solo requieren 16 ranuras de atributo de vértice exclusivas, si usa ingenuamente atributos de float individuales, puede agotar fácilmente todo el almacenamiento disponible solo para almacenar una matriz de 4x4.

No hay forma de evitar esto. A diferencia de los uniformes (las GPU escalares pueden almacenar uniformes float más eficiente que vec4 ), los atributos siempre están ligados a un tipo de datos de 4 componentes. Entonces, para los atributos de los vértices, los atributos de empaquetamiento en vectores es bastante importante.

He actualizado mi respuesta para señalar extractos relevantes de las especificaciones GL y GLSL:

Especificación del perfil principal de OpenGL 4.4 - 10.2.1 Atributos genéricos actuales - pp. 307

Los sombreadores de vértices (consulte la sección 11.1 ) acceden a una matriz de atributos de vértices genéricos de 4 componentes. La primera ranura de esta matriz se numera como cero, y el tamaño de la matriz se especifica mediante la constante dependiente de la implementación GL_MAX_VERTEX_ATTRIBS .

Especificación GLSL 4.40 - 4.4.1 Calificadores de disposición de entrada - Pág. 60

Si una entrada de sombreado de vértice es de tipo escalar o vectorial, consumirá una sola ubicación. Si una entrada de sombreado no-vértice es un tipo escalar o vectorial que no sea dvec3 o dvec4 , consumirá una única ubicación, mientras que los tipos dvec3 o dvec4 consumirán dos ubicaciones consecutivas. Las entradas de tipo double y dvec2 consumirán solo una ubicación única, en todas las etapas.

Es cierto que el comportamiento descrito para dvec4 difiere ligeramente. En formato GL_ARB_vertex_attrib_64bit , los tipos de precisión doble pueden consumir el doble de almacenamiento que el punto flotante, de modo que un dvec3 o dvec4 pueden consumir dos ranuras de atributo. Cuando se promocionó al núcleo, ese comportamiento cambió ... se supone que solo consumen 1 ubicación en la etapa de vértice, potencialmente más en cualquier otra etapa.

Comportamiento original (extensión) de los tipos de vector de precisión doble:

Nombre

ARB_vertex_attrib_64bit

[...]

Además, algunas entradas de sombreado de vértices que usan los componentes de 64 bits más amplios pueden contar el doble frente al límite dependiente de la implementación en el número de vectores de atributos de sombreado de vértices. Un escalar de 64 bits o un vector de dos componentes consume solo un único atributo de vértice genérico; "largo" de tres y cuatro componentes puede contar como dos. Este enfoque es similar al utilizado en el GL actual donde los atributos de matriz consumen atributos múltiples.