2010-12-13 19 views
3

Ich arbeite an einem OpenGL-Projekt und ich möchte mindestens ein wenig Beleuchtung darin. Ich versuche seit einiger Zeit, OpenGLs eingebaute Beleuchtung zu verwenden, aber ich habe nicht viel Erfolg.OpenGL-Normale funktionieren nicht?

Modelle I laden ihre korrekte Normalen (berechnet durch Wings3D) in dieser Reihenfolge an Eckpunkten angehängt:

loop all faces { 
    GL.Normal3(...); 
    GL.TexCoord2(...); 
    GL.Vertex3(...); 
    ... (two more in same order, faces are all triangles) 
} 

Modelle haben einige Material Anrufe vor der GL.Begin(BeginMode.Triangles) wie:

GL.Material(MaterialFace.FrontAndBack, MaterialParameter.AmbientAndDiffuse, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); 
GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Specular, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); 
GL.Material(MaterialFace.FrontAndBack, MaterialParameter.Shininess, 99.0f); 

Hier sind die ersten drei Normalen des ersten Modells geladen (Glaubwürdigkeitsprüfung) n (x, y, z):

0(0.6331236, 0.428246439, 0.6447942) 
1(0.507037938, -0.6987222, 0.504677951) 
2(-0.768829644, -0.494915247, 0.404919624) 
01 Dies ist

, wie ich einrichten Beleuchtung:

GL.Enable(EnableCap.DepthTest); 
GL.Enable(EnableCap.Blend); 
GL.Enable(EnableCap.ColorMaterial); 
GL.Enable(EnableCap.Texture2D); 
GL.Enable(EnableCap.Normalize); 

GL.ShadeModel(ShadingModel.Flat); 

GL.Enable(EnableCap.Lighting); 
GL.Enable(EnableCap.Light0); 
GL.Light(LightName.Light0, LightParameter.Position, new float[] { 0.0f, 1000.0f, 0.0f, 1.0f }); 
GL.Light(LightName.Light0, LightParameter.Ambient, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); 
GL.Light(LightName.Light0, LightParameter.Specular, new float[] { 0.0f, 0.0f, 0.0f, 0.0f }); 
GL.Light(LightName.Light0, LightParameter.Diffuse, new float[] { 1.0f, 1.0f, 1.0f, 1.0f }); 
GL.Light(LightName.Light0, LightParameter.SpotExponent, 0.0f); 

Objekte reagieren auf die Einstellungen um gespielt zu werden, aber alle Gesichter leider die gleiche Helligkeit haben.

Fehle ich etwas oder mache ich etwas falsch?

Antwort

3

Wenn das Umgebungslicht auf {1,1,1,1} eingestellt wird, bedeutet dies, dass alles unabhängig von der Richtung des Lichts vollständig beleuchtet wird. Versuchen Sie, die Umgebungswerte niedriger einzustellen (z. B. 0,2f), damit die Streufeldkomponente etwas bewirken kann.