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.

¿GLSL producido por SPIRV-cross a partir de SPIR-V rompe las reglas de std140?

He puesto mi fragmento de código HLSL aquí: https://shader-playground.timjones.io/d9011ef7826a68ed93394792c2edb732

Compilo HLSL con DXC a SPIR-V y luego uso SPIRV-Cross para obtener el código GLSL.
El búfer constante GLSL está etiquetado con std140 y contiene vec3 y float.
Según mi conocimiento, esto no funcionará. ¿No se debería utilizar aquí GLEXTscalarblocklayout? El bloque constante debería estar etiquetado con scalar en lugar de std140. ¿Estoy pasando por alto algo obvio aquí? Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en glsl, shader, vulkan, hlsl y spir-v, puedo confirmar que el problema planteado por el preguntante es legítimo. Al compilar HLSL a SPIR-V y luego convertirlo a GLSL, el búfer constante etiquetado con std140 que contiene vec3 y float no funcionará como se espera. En este caso, se debe utilizar GL_EXT_scalar_block_layout en su lugar. Esto se debe a que std140 asume que vec3 está alineado en bloques de 16 bytes, lo que puede llevar a ineficiencias de memoria. El uso de una distribución escalar evita este problema.

    Es importante tener en cuenta que la distribución escalar no es compatible en todas las versiones de OpenGL, por lo que es importante verificar la compatibilidad antes de utilizarla. Además, el uso de una distribución escalar puede afectar el rendimiento, por lo que es importante medir y probar el impacto antes de adoptarlo en un entorno de producción.

    En conclusión, el preguntante tiene razón en su suposición de que el búfer constante GLSL debe etiquetarse como escalar en lugar de std140 en este caso particular.

Comments are closed.