opengl - example - ¿Cómo pasa vértice shader información de color a fragment shader?
webgl mozilla (2)
El gradiente proviene de la interpolación entre los colores de vértice que ocurren cuando la variación pasa al fragment shader. Si no quiere interpolar, use la palabra clave "plana" al comienzo de la variación. Su malentendido probablemente se debe a la falta de conocimiento sobre cómo funcionan las etapas de vértice y fragmento. Funcionan de manera diferente. Se invoca el sombreador de vértice por vértice mientras que el fragmento por píxel ocurre. Escanee el área definida por el conjunto primitivo. Y como dije, puede deshabilitar la interpolación "plana". En tal caso, el color del primer atributo del vértice definirá el color general de la forma.
En un sencillo programa OpenGL de hello-world, que simplemente dibuja un triángulo estático en la ventana, cuando configuro el vértice 3 del triángulo en rojo, verde y azul, el triángulo se llena con un degradado.
Pero cuando uso sombreadores como este:
Vertex Shader:
attribute vec4 aVertex;
attribute vec4 aColor;
varying vec4 vColor;
void main(void) {
gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
vColor = aColor;
}
donde los atributos aVertex
y aColor
provienen de un búfer de vértice, se pasan a través de una llamada de glVertexAttribPointer
.
Sombreador de fragmentos:
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
El triángulo todavía está lleno de gradiente, y aquí viene la pregunta:
Si se calcula el vértice-sombreador por vértice, entonces cada instancia de vColor
debe asignarse con el color de un vértice. Y el color del vértice debe ser rojo, verde o azul, como se establece en el búfer del vértice.
Entonces, ¿de dónde viene el gradiente?
O, en otra palabra, ¿cuándo sucedió que en el frag-shader, el vColor
resultó ser el color interpolado en lugar del vértice?
Las variables "variables" en el sombreador de fragmentos tienen como resultado la interpolación lineal entre los valores dados en la etapa de sombreado de vértice (basado en la posición relativa del fragmento entre los vértices).
Es decir, cuando el rasterizador escupe un fragmento en un píxel, su posición también se da en relación con los vértices de triángulos en coordenadas baricéntricas. Estas coordenadas se utilizan para interpolar todas las variables variables del sombreador de vértice. En la mayoría de los casos, esto es lo que quiere y la velocidad obtenida de no interpolar es bastante insignificante en estos días.
El uso de la palabra clave "plana" deshabilitará la interpolación y en su lugar usará el valor del primer vértice (no estoy 100% seguro de que la función "plana" varíe, ya que he cambiado a usar palabras clave de entrada / salida con las versiones más nuevas de GLSL ) .
En una nota lateral, esto me parece particularmente útil si el fragmento necesita algunos valores de cada uno de los vértices. En este caso, uso flat out myVertexValue[3]
en el sombreador de geometría ( por ejemplo aquí ).