PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : OpenGL Specular Lighting — Probleme


aths
2003-12-31, 05:10:58
PROCEDURE Licht;
var //Const
LightAmbient : Array [0..3] Of GLfloat; //= (0.1, 0.1, 0.1, 1.0);
LightDiffuse : Array [0..3] Of GLfloat; //= (0.7, 0.7, 0.7, 0);
LightSpecular : Array [0..3] Of GLfloat; //= (1.0, 1.0, 1.0, 0);
LightPosition : Array [0..3] Of GLfloat; //= (1.0, 3.0, 2.0, lw);
MaterialColor : Array [0..3] Of GLfloat; //= (1.0, 1.0, 0.5, 1.0);
BEGIN

lightambient[0]:=0.01; lightambient[1]:=0.01;lightambient[2]:=0.01;lightambient[3]:=1.0;
LightDiffuse[0]:=1.0; LightDiffuse[1]:=1.0; LightDiffuse[2]:=1.0; LightDiffuse[3]:=1.0;
LightSpecular[0]:=1.0; LightSpecular[1]:=0.0; LightSpecular[2]:=0.0; LightSpecular[3]:=1.0;
LightPosition[0]:=1.0; LightPosition[1]:=3.0; LightPosition[2]:=2.0; LightPosition[3]:=lw;
MaterialColor[0]:=1.0; MaterialColor[1]:=1.0; MaterialColor[2]:=0.3; MaterialColor[3]:=1.0;

glClearDepth(1.0); // Clear the depth buffer
glDepthFunc(GL_LESS); // Type of depth test
glShadeModel (GL_flat); // Smooth color shading
glEnable (GL_DEPTH_TEST); // Depth test
glLightfv (GL_LIGHT0, GL_AMBIENT, @LightAmbient); // Licht erzeugen
glLightfv (GL_LIGHT0, GL_DIFFUSE, @LightDiffuse);
glLightfv (GL_LIGHT0, GL_SPECULAR, @LightSpecular);
glLightfv (GL_LIGHT0, GL_POSITION, @LightPosition);// Lichtposition
glEnable (GL_LIGHT0);
glEnable (GL_LIGHTING);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);

// glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, @lightspecular);
glMaterialfv (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, @MaterialColor);
END;

Wenn ich "glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR, @lightspecular);" wieder einkommentiere, sieht der Torus ziemlich falsch aus: Das Specular Light ist viel zu groß, und es gibt extrem harte Übergänge zum Schattenbereich. Woran könnte das liegen?

ScottManDeath
2003-12-31, 05:30:52
Du musst noch den specular Exponenten mit glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS, spec_exp); setzen. Dann kannst du auch deinen Kommentar weglassen

spec_exp zwischen 0 und 128

0 harter Übergang, fast alles weiß
128 kleines highlight, man braucht eventuell sehr hohe Tesselation oder per Pixel Lichtberechnung um das Highlight richtig zu sehen.


Was auch noch zu empfehlen ist: glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE); damit werden die specular Highlights genauer berechnet (nicht mit konstantem Eye-Vertex Vektor), d.h. das Highlight "bewegt sich" wenn auch das Objekt oder die Lichtquelle bewegt wird.

beta3
2003-12-31, 06:07:51
darf ich erfahren um welche sprache es ihr geht?

aths
2003-12-31, 08:12:40
Original geschrieben von beta3
darf ich erfahren um welche sprache es ihr geht? Das Programm ist zwar in Delphi, aber die Problematik betrifft keine Programmiersprache, sondern OpenGL.


Original geschrieben von ScottManDeath
Du musst noch den specular Exponenten mit glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS, spec_exp); setzen. Dann kannst du auch deinen Kommentar weglassen

spec_exp zwischen 0 und 128

0 harter Übergang, fast alles weiß
128 kleines highlight, man braucht eventuell sehr hohe Tesselation oder per Pixel Lichtberechnung um das Highlight richtig zu sehen. 90 ist ein guter Wert :)

aths
2004-01-04, 13:46:26
Habe es geschafft, Specular Lighting zu aktivieren. Nur — wie schalte ich das wieder ab?

Kant
2004-01-04, 20:58:29
Original geschrieben von aths
Habe es geschafft, Specular Lighting zu aktivieren. Nur — wie schalte ich das wieder ab?
Einfach mit glLightfv (GL_LIGHT0, GL_SPECULAR,@Array_von_0en); die speculare Lichtfarbe auf 0,0,0,0 setzen.

Achill
2004-01-05, 18:32:59
Ansonsten geht es hier zu einer alten Verson des Redbooks

http://www.dcc.unicamp.br/~lmarcos/courses/mc603/redbook/index.html

oder direkt zur Beleuchtung:

http://www.dcc.unicamp.br/~lmarcos/courses/mc603/redbook/chapter05.html

aths
2004-01-06, 17:11:58
Original geschrieben von Kant
Einfach mit glLightfv (GL_LIGHT0, GL_SPECULAR,@Array_von_0en); die speculare Lichtfarbe auf 0,0,0,0 setzen. Cool, klappt.