2011-01-12 14 views
5

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?

Respuesta

3

Solo sigue llamándolos con los nombres antiguos. Si tiene un perfil central (es decir, no compatibilidad con versiones anteriores), los nombres reservados de las especificaciones anteriores de GLSL son liberados declarados como no disponibles; redeciéndolos para el enlace de atributos de vértice. Parece cambiar su atributo de disponibilidad. En el perfil de compatibilidad, los nombres de variables se asignan previamente y se vinculan.

Por lo tanto, se reduce a esto: Mantener la antigua denominación en los sombreadores es una conveniencia y parece funcionar con los compiladores actuales de GLSL. Si quiere ir a un lugar seguro, use el preprocesador para reescribir los nombres reservados del prefijo gl_ en un prefijo elegido por el usuario y vincular ese.

+2

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. –

+0

@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

1

Primero, para responder a su pregunta. No estoy al tanto de ninguna convención de nomenclatura estándar.

Pero ... es más complicado que los nombres de atributos. Oculto bajo la pregunta está la noción de semántica de atributos. Cada uno de los atributos de entrada tiene alguna forma de semántica que cada sombreador espera.

Y lo que aprendí de los nombres gl_ fijos es que no especifican su semántica.

  • ¿Qué espacio es gl_Position in? (respuesta: depende completamente de lo que haya pasado el host. El motor no tiene que pasar en algo que es espacio local, por ejemplo, si lo transformó ya que requirió espacio mundial por diferentes razones).
  • es gl_TexCoord1 una coordenada de textura, ¿o realmente una tangente? ¿Qué hay de su rango? Está codificado?

No está claro si se puede encontrar una nomenclatura específica que realmente resuelva todos estos problemas, pero sería necesario hacer varios motores compatibles.

Más problemático, ni siquiera es obvio que un motor específico (o un activo específico) tenga la capacidad de proporcionar atributos específicos requeridos por un sombreador proveniente de un motor diferente. Entonces que ?

Esas son todas las razones por las que terminamos en entornos de sombreado balcanizados.

+0

La especificación de OpenGL es bastante clara sobre lo que se debe pasar a través de los uniformes y los atributos bien conocidos. Cosas como abusar de gl_TexCoord1 para especificar una tangente tiene su origen en los tiempos, cuando solo había atributos de vértices limitados disponibles y los datos tenían que pasar por otros medios. Para la entrada, OpenGL 4 no especifica ningún nombre especial, todos son atributos de vértices de nombre libre, pero por supuesto los nombres de salida deben estar bien definidos. Diablos, incluso las matrices estándar fueron eliminadas, ahora todas las matrices deben ser especificadas por uniformes. – datenwolf

+1

@datenwolf: mi punto es que, tan pronto como GL proporciona sombreadores, la semántica de las entradas se convierte en responsabilidad del anfitrión, no de GL. Eso es cierto incluso cuando usa las variables gl_ *, y no le da ninguna garantía de que su sombreador funcione en otro motor, p. He visto sombreadores que ni siquiera consumen una posición, aunque es necesario proporcionarla. – Bahbar

+0

Esta pérdida de semántica es, por qué OpenGL-3/4 core ya no tiene esas variables de entrada predefinidas. Solo tiene atributos de vértices genéricos y puedes llamarlos como quieras. Los sombreadores están atados a su motor de renderizado subyacente de todos modos, ya que cualquier técnica avanzada de renderizado depende de varias pasadas de renderización, que son controladas por el motor. Y los sombreadores deben escribir para ajustarse a esos pases. – datenwolf

0

Consulte mi question para obtener una lista de posibles implementaciones de atributos/semántica uniforme. Me temo que, incluso con OpenGL 3.4, este problema no se resolverá y prácticamente quedará en sus propios dispositivos para definir un contrato entre sus sombreadores y su código.

Cuestiones relacionadas