OpenGL Shading Language/Procesor fragmentów
Procesor fragmentów jest miejscem, gdzie fragment shader jest przetwarzany.
Operacje
[edytuj]Jednostka ta jest odpowiedzialna za :
- Obliczanie koloru i współrzędnych tekstury względem pikseli
- Uwzględnianie danych tekstury
- Obliczenia związane z mgłą
- Obliczanie normalnych, jeśli wymagane jest oświetlenie względem pikseli
Fragment shader :
- nie ma dostępu do bufora ramek (ang. frame buffer). Oznacza to, że operacje takie jak ustalanie przeźroczystości zachodzą dopiero po fragment shaderze
- Procesor fragmentów operuje na pojedynczych fragmentach — nie ma pojęcia o sąsiadujących fragmentach.
- nie jest w stanie zmienić położenie fragmentu, które zostało wcześniej obliczone. Przypomnij sobie, że w procesorze werteksów matryce modelview oraz projection mogą zostać użyte do transformacji werteksu. Viewport wchodzi do gry zaraz po tym, jednakże tuż przed procesorem werteksów.
Dane wejściowe
[edytuj]Danymi wejściowymi tej jednostki są interpolowane dane obliczone w poprzednim stadium OpenGL-a takie jak werteksy, kolory, normalne itd.
W vertex shaderze dane te są obliczane dla każdego werteksu. Teraz jednak mamy do czynienia z fragmentami wewnątrz prymitywów - stąd potrzeba interpolowanych danych.
Tak jak w procesorze werteksów, kiedy piszesz fragment shader, zastępuje on całą domyślną funkcjonalność odpowiedniej fazy OpenGL-a. Dlatego też niedopuszczalne jest pisanie shadera, który teksturuje fragment i pozostawia obliczanie mgły zastąpnionemu właśnie stadium. Programista musi zdefiniować wszystkie efekty z jakich korzysta aplikacja.
Shader ma dostęp do stanów OpenGL-a, podobnie jak vertex shader, i może w związku z tym pobrać z OpenGL-a na przykład kolor mgły.
Bardzo istotną informacją jest to iż fragment shader Fragment Shader ma dostep do pozycji piksela na ekranie, jednak nie może go zmienić.
Dane wyjściowe
[edytuj]Fragment shader ma dwie opcje danych wyjściowych:
- usunąć fragment, czyli nie wytworzyć żadnych danych wyjściowych
- obliczyć gl_FragColor (ostateczny kolor fragmentu) lub gl_FragData jeśli renderuje się do wielu źródeł
Głębia także może zostać nadpisana, chociaż nie jest to wymagane skoro poprzednia faza już ją obliczyła.