Como posso dizer a um shader de fragmento para não escrever um pixel específico?


11

Em um WebGL, eu gostaria de enviar um espaço de tela quad através do qual seja processado por um shader de fragmento, mas faça com que o shader de fragmento grave apenas um pixel sob certas condições (digamos ... que estava dentro de um círculo ou que o pixel pertencia ao lado positivo de um meio espaço definido por uma equação de curva ou algo assim).

É possível em um sombreador de fragmento dizer "não escreva um pixel"?

Eu sei que isso pode ser conseguido usando vários outros métodos, como a mistura alfa, renderizando isso primeiro e fazendo com que a cor do plano de fundo não seja desejada para desenhar um pixel, ou talvez fazendo algum truque com os buffers de profundidade ou estêncil. Eu também sei que eu poderia criar um monte de geometria para combinar com o que eu quero renderizar.

Existe uma maneira de fazer com que o shader de fragmento opte por não escrever um pixel?

Respostas:


10

Sim, você pode discardno shader de fragmentos para evitar escrever o pixel. Aqui está um exemplo aleatório que eu descobri no Google.

Observe que isso pode realmente não impedir o processamento do shader de fragmento (como a GPU tende a processar fragmentos em blocos; somente o descarte de todos os fragmentos em um bloco abandonará o processamento). Mas o fragmento não será gravado na saída, que é basicamente o que você deseja.

Você pode estar interessado nesta perguntadiscard relacionada sobre o desempenho e sobre esta no SO.

Não tenho idéia se isso é suportado no WebGL. Caso contrário, você precisará recorrer a uma de suas sugestões (como a mistura alfa; acho que seria a mais direta).


3

A discarddeclaração é útil.

Você não falou muito sobre o seu caminho de decisão; portanto, darei um exemplo usando uma pesquisa simples de textura:

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

(Isso é de algum código de exemplo que escrevi antes de aprender sobre a mistura alfa.)

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.