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.