En las nuevas versiones de lujo de OpenGL (3.0 y 4.0 arriba), atributos de vértice incorporados como gl_Vertex están en desuso. La "nueva forma" de representar realmente algo es especificar sus propios atributos de vértice para la posición, el color, etc., y luego vincular estos atributos personalizados a los búferes.¿Cómo deben escribirse los sombreadores modernos de OpenGL para que sean compatibles entre sí?
Mi pregunta es esta: ¿cómo se puede hacer esto sin acoplar estrechamente el código de renderizado y el sombreador? Si escribo un sombreador que usa "posición" como posición de vértice, el código de host que usa el sombreador debe saberlo y pasar datos de vértice como "posición". Si deseo usar un sombreador diferente que fue escrito para tomar datos de vértice en "vertex_pos", primero tengo que volver a escribir ese sombreador o modificar mi código de host para enviar datos de vértice como "vertex_pos" en su lugar.
¿Existe un conjunto de nombres de mejores prácticas para los atributos estándar de vértice y fragmento que todos los sombreadores deberían usar? ¿O existen estándares específicos del motor de Balkanized, de modo que un sombreador escrito para un motor no puede funcionar en otro sin modificación? ¿O no hay estándares en absoluto, de modo que, en general, cada objeto necesita su propio código de representación personalizado para que coincida con su sombreador personalizado?
En realidad, eso no es cierto. GLSL reserva ** cualquier ** nombre que comience con "gl_". Si un compilador central le permite usar "gl_Vertex", entonces no cumple con la especificación. La especificación 1.50 aclara que la sintaxis de redeclaración solo es válida para cambiar las propiedades del tipo declarado. Por lo tanto, no debería permitirte redeclararlos tampoco. –
@Nicol: Ahora aquí comienza la lavandería de idiomas: algunas personas pueden ver los nombres de las variables en desuso como identificadores predefinidos del perfil de compatibilidad, y su uso en un programa GLSL 1.50 es una redeclaración que cambia la propiedad; En mi humilde opinión, la especificación no es clara al respecto, aunque el §3.3 sobre '# versión' parece indicar que el núcleo significa" No hay nombres de compatibilidad disponibles ". Si uno quiere estar seguro, puede usar el preprocesador '#define gl_Vertex glVertex' y usar ese nombre en el perfil central. – datenwolf