Jak mogę powiedzieć modułowi cieniującemu fragmenty, aby nie zapisywał określonego piksela?


11

W WebGL chciałbym wysłać quad przestrzeni ekranu, który jest przetwarzany przez moduł cieniujący fragmenty, ale moduł cieniujący fragmentów wypisuje piksel tylko pod pewnymi warunkami (powiedzmy ... że był w okręgu lub że piksel należał do dodatniej strony półprzestrzeni zdefiniowanej równaniem krzywej lub czymś innym).

Czy w shaderze fragmentów można powiedzieć „nie pisz piksela”?

Wiem, że można to osiągnąć za pomocą różnych innych metod, takich jak mieszanie alfa, renderowanie tego jako pierwsze i umieszczanie koloru tła tam, gdzie nie chce narysować piksela, lub może zrobić jakąś sztuczkę z buforami głębokości lub matrycy. Wiem też, że mógłbym stworzyć wiązkę geometrii pasującą do tego, co chcę renderować.

Czy istnieje jednak sposób, aby moduł cieniujący fragmentów w ogóle nie zapisywał piksela?

Odpowiedzi:


10

Tak, możesz discardw shaderze fragmentów, aby uniknąć pisania piksela. Oto przypadkowy przykład, który wykopałem z Google.

Zauważ, że nie może to w rzeczywistości zatrzymać przetwarzania modułu cieniującego fragmenty (ponieważ procesor graficzny ma tendencję do przetwarzania fragmentów w blokach; tylko usunięcie ze wszystkich fragmentów w bloku spowoduje przerwanie przetwarzania). Ale fragment nie zostanie zapisany na wyjściu, co jest w zasadzie tym, czego chcesz.

Możesz być zainteresowany tym powiązanym pytaniem dotyczącym wydajnościdiscard i tym w SO.

Nie mam pojęcia, czy jest to obsługiwane w WebGL. Jeśli tak nie jest, musisz wrócić do jednej ze swoich sugestii (jak mieszanie alfa; myślę, że byłoby to najbardziej proste).


3

discardStwierdzenie przydaje.

Nie powiedziałeś zbyt wiele o swojej ścieżce decyzyjnej, więc dam przykład, korzystając z prostego wyszukiwania tekstur:

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

(To z przykładowego kodu, który napisałem, zanim dowiedziałem się o mieszaniu alfa.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.