3

我正在开发一个 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);

对象会对正在播放的设置做出反应,但遗憾的是所有面孔都具有相同的亮度。

我错过了什么还是我做错了什么?

4

1 回答 1

3

将环境光设置为 {1,1,1,1} 意味着一切都将完全点亮,无论灯光的方向如何。尝试将 Ambient 值设置得较低(例如 0.2f),以便 Diffuse 组件可以产生一些效果。

于 2010-12-13T22:45:59.650 回答