Przejdź do zawartości

OpenGL Shading Language/Architektura OpenGL

Z Wikibooks, biblioteki wolnych podręczników.


Zrozumienie działania OpenGL Shading Language, bez wcześniejszego zrozumienia zasady działania OpenGL-a, było by utrudnione. Zrozumienie natomiast co shadery zrobić mogą, a czego nie, nie było by możliwe bez uprzedniego zrozumienia w jakich stadiach OpenGL-a one funkcjonują.

Aby ułatwić Ci zrozumienia tego zagadnienia umieszczony został poniżej diagram prezentujący funkcjonowanie OpenGL-a.

Transformacja werteksów

[edytuj]

Na tym etapie werteks otrzymuje takie atrybuty jak położenie w przestrzeni, kolor, wektor normalny, koordynaty tekstury, oraz wiele innych. Danymi wejściowymi tego stanu są indywidualne właściwości wierzchołków. Oto zestaw funkcji, które są wykonywane w tym stanie:

  • Transformacja pozycji werteksu
  • Obliczenia związane ze światłem
  • Generowanie i transformacja koordynatów tekstury

Montaż i rasteryzacja prymitywów

[edytuj]

Danymi wejściowymi tego stadium są przetransformatowane wierzchołki, jak również informacje o połączeniach danych wierzchołków. Te dane informują OpenGL w jaki sposób wierzchołki łączą się tworząc prymitywy. To właśnie w tym momencie prymitywy są montowane.

Ta faza jest również odpowiedzialna za operacje obcinania w polu widoku oraz tych płaszczyzn, które są odwrócone tyłem do kamery.

Rasteryzacja ustala położenie fragmentów oraz pikseli na prymitywie. Fragment jest w tym momencie kawałkiem danych który zostanie użyty do aktualizowania pikseli w buforze ramek o specyficzne lokalizacji. Fragment zawiera nie tylko kolor, ale również normalne, koordynaty tekstury wraz z innymi możliwymi atrybutami, które są używane do ustalenia nowego koloru piksela.

Danymi wyjściowymi tej fazy są:

  • Pozycja fragmentów w buforze ramek
  • Interpolowane wartości dla każdego fragmentu atrybutów obliczonych w fazie transformacji werteksów

Dane obliczone w tym stadium, połączone z informacją o połączeniach werteksów umożliwiają tej fazie na obliczenie właściwych atrybutów fragmentów. Dla przykładu, każdy werteks ma swoją przetransformatowaną pozycję. Kiedy bierze się pod uwagę wierzchołki tworzące prymityw, możliwe jest obliczenie położenia pozycji fragmentów prymitywu. Innym przykładem jest użycie koloru. Jeśli trójkąt ma wierzchołki w różnych kolorach, wtedy kolory są obliczane na podstawie interpolacji kolorów wierzchołków ważonych przez relatywną odległość od wierzchołków do fragmentów

Teksturowanie i kolorowanie fragmentów

[edytuj]

Interpolowane informacje fragmentów są danymi wejściowymi dla tej fazy. Kolor został już obliczony w poprzednim stadium poprzez interpolację, i tutaj może być połączony z tekselem (elementem tekstury) dla przykładu. Koordynaty tekstury zostały również interpolowane w poprzedniej fazie. Innym elementem, który jest brany pod uwagę podczas obliczania koloru jest mgła, która właśnie w tym momencie powinna być brana pod uwagę. Ogólnym wynikiem tej fazy są kolor fragmentu oraz głębia w jakiej się on znajduje.

Operacje rasteryzujące

[edytuj]

Danymi wejściowymi tego stanu są:

  • Lokacja piksela
  • Głębia fragmentu oraz jego kolor

Ostanie stadium wykonuje szereg testów z użyciem fragmentów, takich jak:

  • Test obcinania
  • Test przeźroczystości
  • Test szablonu
  • Test głębi

Jeśli każdy z tych testów zakończy się sukcesem, atrybuty fragmentu są używane do uaktualnienia danych piksela w zależności od bieżącego trybu mieszania (ang. blending). Zauważ, że mieszanie zachodzi jedynie w tym stadium, gdyż faza teksturowania i kolorowania fragmentów nie ma dostępu do bufora klatek. Powtórzmy to jeszcze raz: bufor klatek jest dostępny jedynie w tym stadium.

Podsumowanie domyślnych funkcji stadiów OpenGL

[edytuj]

Poniższy diagram opisuje zachowanie się powyżej opisanych stadiów:

Zastępowanie domyślnych funkcji

[edytuj]

Nowoczesne karty graficzne dają programiście możliwość zdefiniowania dwóch z powyżej opisanych stadiów:

  • Transformacja werteksów
  • Teksturowanie i kolorowanie fragmentów

Fazy te, odtąd znane jako procesor werteksów i procesor fragmentów, zostaną opisane w następnych rozdziałach.