PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Flat Shading — winkelabhängig?


aths
2004-02-04, 05:58:29
Stimmen diese Behauptungen?

- Flat (bzw. Gouraud-) Shading sind tatsächlich "diffus", also es interessiert nur der Winkel vom Dreieck zur Lichtquelle, nicht der Winkel vom Dreieck zum Betrachter.

- Specular Lighting berücksichtigt diesen Winkel jedoch auch.

Demirug
2004-02-04, 07:46:46
Original geschrieben von aths
Stimmen diese Behauptungen?

- Flat (bzw. Gouraud-) Shading sind tatsächlich "diffus", also es interessiert nur der Winkel vom Dreieck zur Lichtquelle, nicht der Winkel vom Dreieck zum Betrachter.

- Specular Lighting berücksichtigt diesen Winkel jedoch auch.

Du wirfst hier zwei Sachen in einen Topf.

Flat und Gouraud Shading beschreiben lediglich wie mit den Pixeln innerhalb der Primitive Fläche verfahren wird. Bei Flat bekomme alle Pixel die gleiche Farbe und bei Gouraud wird zwischen den Eckwerten interpoliert.

Wenn man Diffuses Licht braucht dann nimmt man auch Diffuse Lighting.

Specular Lighting kann den Vektor (Vertex - Kamera) berücksichtigen wenn man das wünscht. Bei DX HT&L gibt es dafür den LocalViewer Renderstate.

aths
2004-02-04, 08:02:35
Original geschrieben von Demirug
Du wirfst hier zwei Sachen in einen Topf.

Flat und Gouraud Shading beschreiben lediglich wie mit den Pixeln innerhalb der Primitive Fläche verfahren wird. Bei Flat bekomme alle Pixel die gleiche Farbe und bei Gouraud wird zwischen den Eckwerten interpoliert.Ja, ich weiß :)
Original geschrieben von Demirug
Wenn man Diffuses Licht braucht dann nimmt man auch Diffuse Lighting.

Specular Lighting kann den Vektor (Vertex - Kamera) berücksichtigen wenn man das wünscht. Bei DX HT&L gibt es dafür den LocalViewer Renderstate. In OpenGL nutze ich derzeit 3 Lighting-Arten: Ambient (Grund-Beleuchtung), Diffuse (je nach Wunsch Flat oder Smooth, wobei Smooth = Gouraud) und Specular.

Meine Frage ist, ob Diffuse nun wirklich diffus ist, oder den Winkel von Fläche zum Auge mit berücksichtigt.

Demirug
2004-02-04, 08:15:28
Original geschrieben von aths
Ja, ich weiß :)
In OpenGL nutze ich derzeit 3 Lighting-Arten: Ambient (Grund-Beleuchtung), Diffuse (je nach Wunsch Flat oder Smooth, wobei Smooth = Gouraud) und Specular.

Meine Frage ist, ob Diffuse nun wirklich diffus ist, oder den Winkel von Fläche zum Auge mit berücksichtigt.

Die OpenGL Formel nach der Diffuses Licht berechnet kenne ich jetzt nicht. Bei der DX-Formel wird nur die Vertexnormale und der Lichtvektor einbezogen.

Gast
2004-02-04, 11:14:04
Diffuse lighting in OpenGL bezieht nur Vertexnormale und Vektor vom Vertex zum Licht in die Berechnung mit ein, laut Seite 207 OpenGL Programming Guide: [(max{L dot n,0}) * diffuse light * diffuse material]

aths
2004-02-04, 18:04:52
Das heißt, die Entfernung zur Lichtquelle spielt auch keine Rolle??

Muh-sagt-die-Kuh
2004-02-04, 18:15:19
Original geschrieben von aths
Das heißt, die Entfernung zur Lichtquelle spielt auch keine Rolle?? Ja, diffuses Licht wird eben durch einen einfachen Lambert-Reflektor modelliert....und bei diesem spielt eben die Entfernung keine Rolle.

Gast
2004-02-04, 18:56:45
Original geschrieben von aths
Das heißt, die Entfernung zur Lichtquelle spielt auch keine Rolle??

Ich habe vergessen dazuzuschreiben, dass L und n normalisiert sind, hoffe jedoch, dass das klar war.
Das hat auch nichts mit damit zu tun, das bei diffuser Beleuchtung die Oberfläche als Lambert Reflektierer angenommen wird, so weit ich mich erinnern kann, sagt das nur aus, dass ein Lamber Reflektieren das eintreffende Licht gleichstark in alle Richtungen reflektiert.
"Wieviel" Licht da nun beim Vertex ankommt, hat natürlich schon was mit der Entfernung zu der Lichtquelle zu tun und wird unter OpenGL folgendermaßen modelliert:

[1/{kc + kl*d + kq*(d^2)}] * Formel für diffuse Beleuchtung

wobei kc ist GL_CONSTANT_ATTENUATION, kq ist GL_LINEAR_ATTENUATION, kq ist GL_QUADRATIC_ATTENUATION und d ist die Entfernung zwischen Vertex und Licht
Damit kann man sich also je nach Wahl der Koeffizienten die Funktion in begrenzten Maße verändern, um die "Lichtabnahme" der jeweiligen Lichtquell zu simulieren.

ScottManDeath
2004-02-04, 19:22:44
Die Entfernung spielt auch eine Rolle in Form der Attenuation. Dabei wird die Intensität des Lichtes abhängig von der Entfernung verringert.

Ergänzend hier ein Cg Vertexshader (aus einem grade fertiggestelltem Projekt ) der ein Point Light mit Local Viewer berechnet, alles konform nach der OpenGL Lichtberechnung =)

Demo gibts dann wenn ich es auf meinem Webspace geladen habe, unter anderem mit Vertex Lighting, Pixel Lighting Bumpmapping und Parallax Mapping.........



// funktion für point light
// man beachte das alle positionen / normalen im selben koordinatensystem sind
// addiert lichtintensität zur eingabe hinzu !!
void point_light (
// ein /ausgabe
inout float4 diffuse,
inout float4 specular,

// vertex
in float3 position,
in float3 normal,

// eye
in float3 eye_position,

// licht
in float3 light_position,
in float3 light_attenuation,

// material
in float4 material_shininess,

// vormultiplizierte farben
in float4 k_ambient,
in float4 k_diffuse,
in float4 k_specular
)
{
//differenzvektoren
// wir speichern die distanz für die attenuation
float3 vertex_light = light_position - position;

float distance = length(vertex_light);
vertex_light /= distance;

float3 vertex_eye = normalize(eye_position - position);


// half vektor
float3 half_vec = normalize(vertex_eye+vertex_light);

// lichtberechnung, lit führt die Exoonention für das Specular Light durch
float4 dots = lit ( dot(normal,vertex_light), dot(normal,half_vec),material_shininess);

float3 dist_vect = { 1.0f, distance, distance*distance };
float attenuation = 1.0f / dot(light_attenuation, dist_vect);



// ausgabe der farben

diffuse+= attenuation * (k_ambient + dots.y * k_diffuse);
specular+= attenuation * k_specular* dots.z;
}

// eintrittspunkt für das vertex programm
void main (

// attribute
in float4 position : ATTR0,
in float4 tangent : ATTR1,
in float4 binormal : ATTR2,
in float4 normal : ATTR3,
in float2 tex_coord : ATTR4,

//matrizen
uniform float4x4 model_view,
uniform float4x4 model_view_IT,
uniform float4x4 model_view_projection,


// für das fragment programm
out float4 o_position : POSITION,
out float4 o_diffuse : COLOR0,
out float4 o_specular : COLOR1,
out float2 o_tex_coord0 : TEXCOORD0,



//licht & material
uniform float4 l_position[3],
uniform float3 l_attenuation[3],


uniform float4 k_ambient[3],
uniform float4 k_diffuse[3],
uniform float4 k_specular[3],

uniform float m_shininess[3]

)
{

o_tex_coord0 = tex_coord;
// vertex in clip space
o_position = mul(model_view_projection,position);

float4 diffuse_sum = {0.0f,0.0f,0.0f,0.0f};
float4 specular_sum= {0.0f,0.0f,0.0f,0.0f};

//position,normaler in eye space
float3 eye_normal = normalize( mul(model_view_IT,normal).xyz );
float4 eye_position = mul(model_view,position);

point_light ( diffuse_sum,
specular_sum,

eye_position,
eye_normal,

float3(0.0f,0.0f,1.0f), // Position des Auges in Eye Space

l_position[0].xyz,
l_attenuation[0],

m_shininess[0],

k_ambient[0],
k_diffuse[0],
k_specular[0]
);

// ausgabe der farben
o_diffuse = diffuse_sum;
o_specular = specular_sum;
}

aths
2004-02-05, 04:56:34
Flat Shading ist also noch einfacher, als ich dachte. Danke für die Infos.

Beim OpenGL Specular Lighting, wird da das Reflektionsgesetz (Einfallswinkel = Ausfallswinkel) angewendet? Dem Wortsinne nach müsste das ja eigentlich der Fall sein.

ScottManDeath
2004-02-05, 11:54:54
Nein, dies geschieht nur beim Lichtmodell (für Specular) nach Phong. Dort hängt das Specular vom Skalarprodukt des Vektors (Vertex->Auge) und dem an der Normale reflektiertem Vektor (Vertex->Licht) ab. Das Skalarprodukt wird dann noch mit den Specular Exponent "hochgenommen" ;)

OpenGL (wie auch die DX Fixed Function) nutzt hingegen das Lichtmodell nach Blinn. Dabei hängt die Intensität des Specular vom Skalarprodukt des Normalenvektors und des "Halfvektors" ab. Dieser ist die Normalisierte Summe aus dem Vektor (Vertex->Licht, aka L) und dem Vektor (Vertex->Auge, aka V). Das ganze wird dann noch mit dem Specular Exponent "gepowert" ;)


http://www.siggraph.org/education/materials/HyperGraph/illumin/similum0.htm



grrr ich hasse es diesen Mix aus "Fachwörtern" und Deutsch zu schreiben, weder Fisch noch Fleisch.....;)

aths
2004-02-06, 04:00:13
Original geschrieben von ScottManDeath
Dieser ist die Normalisierte Summe aus dem Vektor (Vertex->Licht, aka L) und dem Vektor (Vertex->Auge, aka V).Dieses "V" spielt bei Diffuse aber keine Rolle?

Ist beim Specular mit V nicht dann doch das Reflektionsgesetz "Einfallswinkel = Ausfallswinkel" wirksan?

Demirug
2004-02-06, 08:14:20
Original geschrieben von aths
Dieses "V" spielt bei Diffuse aber keine Rolle?

Ja.

Ist beim Specular mit V nicht dann doch das Reflektionsgesetz "Einfallswinkel = Ausfallswinkel" wirksan?

Reflektionen sind zu teuer in der Berechnung deswegen faked man das mit einem Halbvektor H.

H = norm(norm(Cp - Vp) + Ldir)

aths
2004-02-06, 09:48:54
Original geschrieben von Demirug
Reflektionen sind zu teuer in der Berechnung deswegen faked man das mit einem Halbvektor H.

H = norm(norm(Cp - Vp) + Ldir) Bei aths muss man immer ein bisschen langsamer erklären.

Ldir ist sicher die Light-Direction. Was ist jetzt Cp und Vp? Wie wendet man H anschließend an? Im Netz finde ich zu den Lighting-Modellen entweder nur eine allgemeine Beschreibung, oder Mathematik, die ich nicht verstehe.

Kant
2004-02-06, 12:04:08
Original geschrieben von aths
Bei aths muss man immer ein bisschen langsamer erklären.

Ldir ist sicher die Light-Direction. Was ist jetzt Cp und Vp? Wie wendet man H anschließend an? Im Netz finde ich zu den Lighting-Modellen entweder nur eine allgemeine Beschreibung, oder Mathematik, die ich nicht verstehe.

Cp=Cameraposition, Vp=Vertexposition ?

Blinn :
Der Halfangle(H) ist die Mitte der Vectoren L (von vertex zu Licht) und V (von Vertex zu Auge)=> H=(L+V)/2 . Jetzt noch mit der Normalen (N) gedottet => (N*H)^spec.exponent, und fertig ist das speculare Licht nach Blinn.

Phong :
Der Vector zum Auge(V) wird an der Normalen(N) reflektiert (edit : gespiegelt nicht reflektiert) und ergibt den Vector R. Mit (R*L)^spec. exponent erhält man dann das speculare Licht nach Phong.


Blinn ist mathematisch einfacher(und schneller), aber ich habe den Eindruck das mein Lighting besser aussieht, seit ich es mit "richtigem" Phong berechne.

Demirug
2004-02-06, 12:07:36
Cp = Camera Pos
Vp = Vertexpos

Der Halbvektor H wird dann mit einer Dot-Operation mit der Normalen verrechnet. Das Ergebniss davon wird dann mit der "Specular reflection power" (habe denn deutsche Begiff dafür gerade nicht im kopf) potenziert. Dann geht es weiter wie bekannt.