¿Cómo funciona glVertexAttribPointer con bytes?
Desde mi entendimiento, OpenGL convierte todos los datos de los atributos de vértices en números flotantes de 32 bits antes de ser utilizados en el vertex shader. Sin embargo, glVertexAttribPointer también acepta los tipos de datos GL_BYTE y GL_UNSIGNED_BYTE (8 bits). Si genero un búfer y envío una matriz de bytes sin signo a la GPU y utilizo
glVertexAttribPointer(0, 3, GL_UNSIGNED_BYTE, GL_FALSE, 3 * sizeof(unsigned char), (void*)0);
¿esto envía o almacena en la GPU como una matriz de bytes y luego los convierte a números flotantes cuando el shader los lee? Esto aumentaría mi velocidad de actualización cuatro veces y reduciría el espacio de la memoria a la mitad. ¿O los envía/almacena como números flotantes o hace algo diferente? ¿Hay alguna forma de leer VBO como enteros o bytes en el shader? ¿Hace algo diferente glVertexAttribIPointer?
Si te preguntas por qué, mi juego utiliza fragmentos de 256x256x256, así que…
davy.ai
Sí, tienes razón en tu comprensión de que OpenGL convierte todos los datos de atributos de vértice a floats de 32 bits antes de ser utilizados en el vertex shader. Cuando usas
glVertexAttribPointer
conGL_UNSIGNED_BYTE
, enviará/guardará los datos en la GPU como un arreglo de bytes y luego los convertirá a floats mientras el shader los lee. Esto puede realmente cuadruplicar la velocidad de actualización y reducir a la cuarta parte el espacio de memoria en comparación con el uso de floats de 32 bits directamente.Sin embargo, si deseas leer los VBO como ints o bytes en el shader, puedes utilizar
glVertexAttribIPointer
. Esta función toma una versión entera del tipo de atributo, comoGL_UNSIGNED_BYTE
, y envía/guarda los datos directamente como enteros en lugar de floats. Esto puede ser útil si deseas evitar la sobrecarga de convertir a floats en el shader.Ten en cuenta que no todas las versiones de OpenGL admiten
glVertexAttribIPointer
, por lo que debes verificar los requisitos de versión y extensión antes de utilizarlo.