c++ - glPixelStorei(GL_UNPACK_ALIGNMENT, 1) ¿Desventajas?
opengl textures (2)
¿Cuáles son las desventajas de usar siempre el algoritmo de 1?
glPixelStorei(GL_UNPACK_ALIGNMENT, 1)
glPixelStorei(GL_PACK_ALIGNMENT, 1)
¿Afectará el rendimiento en gpus moderno?
¿Afectará el rendimiento en gpus moderno?
No, porque la configuración del almacén de píxeles solo es relevante para la transferencia de datos desde o hacia la GPU, es decir, la alineación de sus datos. Una vez que está en la memoria de la GPU, se alinea de la manera que desee la GPU y el controlador.
¿Cómo pueden los datos no estar alineados en 1 byte?
Esto sugiere fuertemente una falta de comprensión de lo que significa la alineación de filas en las operaciones de transferencia de píxeles .
Se espera que los datos de imágenes que pase a OpenGL se agrupen en filas. Cada fila contiene un número de píxeles de width
, siendo cada píxel el tamaño definido por el formato y los parámetros de tipo. Por lo tanto, un formato de GL_RGB
con un tipo de GL_UNSIGNED_BYTE
dará como resultado un píxel de 24 bits de tamaño. De lo contrario, se espera que los píxeles estén empaquetados, por lo que una fila de 16 de estos píxeles ocupará 48 bytes.
Se espera que cada fila se alinee en un valor específico, como se define en GL_PACK/UNPACK_ALIGNMENT
. Esto significa que el valor que agrega al puntero para llegar a la siguiente fila es: align(pixel_size * width, GL_*_ALIGNMENT)
. Si el tamaño del píxel es de 3 bytes, el ancho es 2 y la alineación es 1, el tamaño del byte de la fila es 6. Si la alineación es 4, el tamaño del byte de la fila es ocho .
Ver el problema?
Los datos de la imagen, que pueden provenir de algún formato de archivo de imagen cargado con algún cargador de imágenes, tienen una alineación de fila. Algunas veces esto está alineado con 1 byte, y otras veces no . Las imágenes DDS tienen una alineación especificada como parte del formato. En muchos casos, las imágenes tienen alineaciones de filas de 4 bytes; Los tamaños de píxel de menos de 32 bits tendrán, por lo tanto, relleno al final de las filas con ciertos anchos. Si la alineación que le da a OpenGL no coincide con eso, entonces obtendrá una textura malformada.
Establece la alineación para que coincida con la alineación del formato de imagen. Si sabe o puede asegurarse de que su alineación de filas siempre es 1 (y eso es poco probable a menos que haya escrito su propio formato de imagen o escritor DDS), debe configurar la alineación de filas para que sea exactamente lo que usa su formato de imagen.