2012-01-14 16 views
8

Estoy tratando de pasar un booleano a mi vertex shader por primera vez; Solo he estado usando flotadores hasta ahora.OpenGL ES (2.0) Lenguaje de sombreado: ¿Cómo se ingresa booleano en el sombreado de vértices y se pasa al sombreador de fragmentos?

El booleano en cuestión es primitivo-específico por lo que no se puede pasar como un uniforme. Sin embargo, tiene el mismo valor para todos los vértices de cualquier primitiva dada.

Parece que, según las especificaciones de Khronos, 'variar' es la única forma de pasar datos al sombreador de fragmentos, pero no es de sorprender que se declare 'variando bool my_bool;' causa un error de analizador cuando está definido en mi sombreador de vértices.

estoy pasando el booleano en mi vertex shader como:

attribute bool a_my_bool; 

que definir una variable en un intento de pasar al fragment shader:

varying bool v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

Podría alguien por favor me diga cómo Puedo lograr lo que intento?

Respuesta

12

De §4.3.5 de The OpenGL® ES Shading Language version 1.0.17 (PDF):

El calificador variando sólo se puede utilizar con los tipos de datos flotador, vec2, vec3, vec4, mat2, MAT3, y mat4, o matrices de estos.

Y desde §4.3.3:

El calificador atributo sólo se puede utilizar con los tipos de datos float, vec2, vec3, vec4, mat2, MAT3 y mat4. Las variables de atributo no se pueden declarar como matrices o estructuras .

lo que no puede tener un attribute bool, y mucho menos un varying bool, de acuerdo con la especificación.

Si realmente necesita un valor booleano por vértice, puede usar 0.0 para falso y 1.0 para verdadero. Al realizar la prueba, verifique x > 0.5.por ejemplo:

// vertex shader 
attribute float a_my_bool; 
varying float v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

// fragment shader 
varying float v_my_bool; 
void main() { 
    if (v_my_bool > 0.5) { 
     // my_bool is true 
     // ... 
    } else { 
     // my_bool is false 
     // ... 
    } 
} 

Siempre que todos los vértices en cada triángulo tengan el mismo valor, esto debería funcionar. Si no son consistentes, terminará con diferentes fragmentos para el mismo triángulo que se comporta de manera diferente. (Si se pega a 0.0 y 1.0, el cuarto del triángulo más cercano a la esquina "impar" se comportará de manera diferente del resto.)

3

Le recomiendo encarecidamente que no use el atributo y lo cambie a uniformes aunque el booleano esté unido a una primitiva dada. Con Uniform lo configura una vez y lo usa muchas veces, con el atributo aumenta mucho el ancho de banda de memoria requerido en cada dibujo. El único sentido que veo en esto es si realiza un lote extremo de sus primitivos, pero, incluso en ese caso, los beneficios reales de esta solución deben evaluarse cuidadosamente, ya que el riesgo es lograr el efecto contrario.

Acerca de las variables que varían, un error común es no declarar la variable en ambos sombreadores de vértices y el fragmento y se pierda uno de los 2.

Esto elevaría un error de vinculación y se daría cuenta de que de todos modos marcando la compilación y vinculando resultados.

Otro aspecto que verificaría en su lugar es asegurarse de que las variables se asignen y usen en su código ya que el compilador elimina los contenidos no utilizados (optimización de código inactivo) y esto da como resultado un problema muy común.

Cuestiones relacionadas