2014-12-20 12 views
5

Więc czytałem "Oficjalny przewodnik OpenGL" oraz w dziale, w którym nauczali oświetlenia materiałowego, nagle użyli "płaskiego" kwalifikatora dla zmiennej wejściowej w shaderze fragmentu. W tej sprawie wziąłem pod uwagę i wszystko, co wymyśliłem, to "płaskie cieniowanie" i "płynne cieniowanie" oraz różnice między nimi, których nie rozumiem, jak są one powiązane z prostą zmienną "MatIndex". oto przykładowy kod z książki:Kwalifikator "płaski" w glsl?

struct MaterialProperties { 
vec3 emission; 
vec3 ambient; 
vec3 diffuse; 
vec3 specular; 
float shininess; 
}; 
// a set of materials to select between, per shader invocation 
const int NumMaterials = 14; 
uniform MaterialProperties Material[NumMaterials]; 
flat in int MatIndex; // input material index from vertex shader 

Co w tym wszystkim chodzi?

Odpowiedz

16

W ogólnym przypadku nie ma odwzorowania 1: 1 między wierzchołkiem a fragmentem. Domyślnie powiązane dane na wierzchołek są interpolowane na poziomie podstawowym w celu wygenerowania odpowiednich powiązanych danych na jeden fragment, co daje efekt cieniowania.

Za pomocą słowa kluczowego flat nie jest wykonywana interpolacja, więc każdy fragment wygenerowany podczas rasteryzacji tego konkretnego prymitywu otrzyma te same dane. Ponieważ prymitywy są zwykle definiowane przez więcej niż jeden wierzchołek, oznacza to, że w tym przypadku używane są dane tylko z jednego wierzchołka. Nazywa się to provoking vertex w OpenGL.

Należy również pamiętać, że typy całkowite nigdy nie są interpolowane. Musisz musi zadeklarować je jako flat w każdym przypadku.

W twoim konkretnym przykładzie kod oznacza, że ​​każdy prymityw może mieć tylko jeden materiał, który jest zdefiniowany przez identyfikator materiału prowokującego wierzchołka każdego prymitywu.

+0

Przepraszam, ale co oznacza "interpolacja" w naszym kontekście? Angielski nie jest moim ojczystym językiem i kiedy próbuję uzyskać tłumaczenie w moim języku, otrzymuję "interpolatsia", czyli to samo słowo. = [ – Pilpel

+3

@Pilpel: [interpolacja] (https://en.wikipedia.org/wiki/Interpolation) to ogólna koncepcja, którą powinieneś poznać, kiedy chcesz robić grafikę. Przy interpolacji zwykle ma się zestaw punktów danych i próbuje wygenerować wartości dla pomiędzy danymi punktami danych. W tym kontekście mamy dane na temat werteksów i musimy je interpolować na fragment. Wyobraź sobie trójkąt z kolorem na wierzchołek.Dla wierzchołka A określamy kolor czerwony, dla wierzchołka B, określamy kolor zielony, a dla wierzchołka C kolor niebieski. Interpolacja generuje gładkie gradienty kolorów w całym trójkącie. – derhass

3

Jest to część tego, jak atrybut jest interpolowany dla modułu cieniującego fragmentu, domyślną interpolacją jest perspektywa.

w GLSL spec section 4.5

Zmienna kwalifikowana jako płaskim nie będzie interpolowana. Zamiast tego, będzie mieć tę samą wartość dla każdego fragmentu w trójkącie. Ta wartość będzie pochodzić z jednego prowokującego wierzchołka, zgodnie z opisem w Specyfikacji systemu graficznego OpenGL . Zmienna może być zakwalifikowane jako płaskim można również zakwalifikować jako ciężkości lub próbki, co oznacza to samo jako kwalifikujące go tylko jak płaskim

Integral atrybuty potrzebne, aby być płaska.

Możesz znaleźć tabelę, której wierzchołek jest prowokującym wierzchołkiem w tabeli 13.2 w sekcji 13.4. openGL spec.