2014-12-20 54 views
5

So las ich "The Official OpenGL Guide" und in einem Abschnitt, in dem sie die Materialbeleuchtung lehrten, verwendeten sie plötzlich das "flache" Qualifikationsmerkmal für eine Eingabevariable im Fragment-Shader. Ich google die Sache und alles, was ich kam, war "flache Schattierung" und "glatte Schattierung" und die Unterschiede zwischen ihnen, die ich nicht verstehen kann, wie es auf eine einfache "MatIndex" Variable bezogen ist. hier ist das Beispiel-Code aus dem Buch:"flat" Qualifier in 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 

Was ist das alles?

Antwort

16

Im allgemeinen Fall gibt es kein 1: 1-Mapping zwischen einem Vertex und einem Fragment. Standardmäßig werden die zugehörigen Daten pro Stützpunkt über das Grundelement interpoliert, um die entsprechenden zugeordneten Daten pro Fragment zu erzeugen, was auch für die Schattierung gilt.

Mit dem Schlüsselwort flat wird keine Interpolation durchgeführt, sodass jedes Fragment, das während der Rasterung dieses bestimmten Primitivs generiert wird, die gleichen Daten erhält. Da Grundelemente normalerweise durch mehr als einen Stützpunkt definiert werden, bedeutet dies, dass die Daten von nur einem Stützpunkt in diesem Fall verwendet werden. Dies wird in OpenGL provoking vertex genannt.

Beachten Sie auch, dass Integer-Typen niemals interpoliert werden. Sie müssen auf jeden Fall als flat deklarieren.

In Ihrem speziellen Beispiel bedeutet der Code, dass jedes Primitiv nur ein Material haben kann, das durch die Material-ID des provozierenden Scheitelpunkts jedes Primitivs definiert ist.

+0

Entschuldigung, aber was bedeutet "Interpolation" in unserem Kontext? Englisch ist nicht meine Muttersprache und wenn ich versuche, seine Übersetzung in meine Sprache zu bekommen, bekomme ich "Interpolatsia", das ist das gleiche Wort. = [ – Pilpel

+3

@Pilpel: [interpolation] (https://en.wikipedia.org/wiki/Interpolation) ist ein allgemeines Konzept, mit dem Sie sich vertraut machen sollten, wenn Sie Grafiken erstellen möchten. Bei der Interpolation hat man normalerweise eine Menge von Datenpunkten und versucht Werte zwischen den gegebenen Datenpunkten zu erzeugen. In diesem Kontext haben wir Per-Vertex-Daten und müssen diese pro Fragment interpolieren. Stellen Sie sich ein Dreieck mit Farbe pro Ecke vor.Für Vertex A geben wir Rot an, für Vertex B geben wir Grün an und für Vertex C geben wir Blau an. Die Interpolation erzeugt glatte Farbverläufe über das gesamte Dreieck. – derhass

3

Es ist ein Teil davon, wie das Attribut für den Fragment-Shader interpoliert wird, der Standardwert ist eine Perspektive korrekte Interpolation.

im GLSL spec section 4.5

Eine Variable qualifiziert als flache werden nicht interpoliert werden. Stattdessen wird für jedes Fragment innerhalb eines Dreiecks denselben Wert haben. Dieser Wert wird von einem einzelnen provozierenden Vertex kommen, wie von der OpenGL Graphics System Specification beschrieben. Eine Variable kann qualifiziert sein als flach kann auch als Schwerpunkt oder Probe, qualifiziert werden, die das gleiche bedeuten wird, da es nur als flach

Integral Attribute müssen flach sein qualifizieren.

Die Tabelle, deren Scheitelpunkt der provozierende Scheitelpunkt ist, finden Sie in der Tabelle openGL spec in Kapitel 13.4.