es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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…

Tags:  

Answer

  1. Avatar for 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 con GL_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, como GL_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.

Comments are closed.