¿Cómo puedo decirle a un sombreador de fragmentos que no escriba un píxel en particular?

11

En un WebGL, me gustaría enviar un espacio de pantalla cuádruple que sea procesado por un sombreador de fragmentos, pero que el sombreador de fragmentos solo escriba un píxel bajo ciertas condiciones (digamos ... que estaba dentro de un círculo, o que el píxel pertenecía al lado positivo de un medio espacio definido por una ecuación de curva o algo así).

¿Es posible dentro de un sombreador de fragmentos decir "no escriba un píxel"?

Sé que esto podría lograrse utilizando varios otros métodos como la mezcla alfa, renderizando esto primero y haciendo que coloque el color de fondo donde no quiere dibujar un píxel, o tal vez haciendo algún truco con los buffers de profundidad o plantilla. También sé que podría crear un montón de geometría para que coincida con lo que quiero renderizar.

¿Hay alguna forma de hacer que el sombreador de fragmentos elija no escribir un píxel?

Alan Wolfe
fuente

Respuestas:

10

Sí, puede discardhacerlo en el sombreador de fragmentos para evitar escribir el píxel. Aquí hay un ejemplo al azar que saqué de Google.

Tenga en cuenta que esto puede no detener el procesamiento del sombreador de fragmentos (ya que la GPU tiende a procesar fragmentos en bloques; solo el descarte de todos los fragmentos en un bloque abandonará el procesamiento). Pero el fragmento no se escribirá en la salida, que es básicamente lo que desea.

Puede interesarle esta preguntadiscard relacionada sobre el rendimiento de y esta en SO.

Sin embargo, no tengo idea si esto es compatible con WebGL. Si no es así, deberá recurrir a una de sus sugerencias (como la combinación alfa; creo que sería la más sencilla).

Comunidad
fuente
3

La discarddeclaración es útil.

No dijo demasiado sobre su camino de decisión, por lo que ofreceré un ejemplo usando una búsqueda de textura simple:

void main() {
    gl_FragColor = texture2D(u_texture, v_uv) * u_color;
    if (gl_FragColor.a <= 0.0) discard;
}

(Eso es de un código de muestra que escribí antes de aprender sobre la mezcla alfa).

Rutter
fuente