OpenGL Shading Language/Procesor fragmentów

Z Wikibooks, biblioteki wolnych podręczników.

Procesor fragmentów jest miejscem, gdzie fragment shader jest przetwarzany. Jednostka ta jest odpowiedzialna za operacje takie jak:

  • 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

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 - z tą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.

Procesor fragmentów operuje na pojedynczych fragmentach — nie ma pojęcia o sąsiadujących fragmentach. 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 nie jest w stanie zmienić położenie fragmentu, które zostało wcześniej obliczone. Przypomij 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. Fragment Shader ma dostep do pozycji piksela na ekranie, jednak nie może go zmienić.

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.

Zwróć uwagę na to, że 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.