Przejdź do zawartości

OpenGL Shading Language/Procesor fragmentów

Z Wikibooks, biblioteki wolnych podręcznikó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.