我正在开发一个OpenGL项目,我至少想要一点点照明。 我现在尝试使用内置照明的OpenGL,但我没有取得多大成功。
我加载的模型有正确的法线(由Wings3D计算)按顺序附加到顶点:
loop all faces {
GL.Normal3(...);
GL.TexCoord2(...);
GL.Vertex3(...);
... (two more in same order, faces are all triangles)
}
模型在Material
之前有一些GL.Begin(BeginMode.Triangles)
次调用,如:
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);
以下是加载的第一个模型(可信性检查)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)
这就是我设置灯光的方式:
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);
对象会对正在播放的设置作出反应,但所有脸部的亮度都相同。
我错过了什么或者我做错了什么?
答案 0 :(得分:3)
将环境光设置为{1,1,1,1}表示无论光线方向如何,所有内容都将完全亮起。尝试将Ambient值设置得较低(例如0.2f),以便Diffuse组件可以产生一些效果。