很长一段时间以来,我一直推迟在 OpenTK 中进行的一个项目中修复照明。问题基本上是当我旋转相机时,我正在显示的地形上显示的照明也会旋转。
这是我的 onRenderFrame 代码片段:
protected override void OnRenderFrame(FrameEventArgs e)
{
base.OnRenderFrame(e);
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
float dist = (float)Math.Sin(Math.PI / 3) * camZoom;
Matrix4 view = Matrix4.LookAt(new Vector3(-(float)Math.Cos(camRot) * dist, dist, -(float)Math.Sin(camRot) * dist) + camPos, camPos, new Vector3(0, 1, 0));
//Note: camPos isn't actually the position of the camera, rather the target of it. The actual camera position is calculated above.
GL.MatrixMode(MatrixMode.Modelview);
GL.LoadMatrix(ref view);
float tx = 50;
float ty = 20;
float tz = -15;
GL.Light(LightName.Light0, LightParameter.Position, new float[] { tx, ty, tz});
GL.Begin(BeginMode.Lines);
DrawBox(tx - 2, tx + 2, ty - 2, ty + 2, tz - 2, tz + 2);
GL.End();
...地形图在这里
我使用我的快速 DrawBox 函数在灯光的位置周围绘制了一个简单的框。它工作正常,我什至实现了一些运动,例如围绕地球的太阳。虽然相机没有移动,但效果很好。但是一旦我转动相机,灯光不再显示它应该有的东西,它似乎已经“移动”了灯光,但实际上并没有移动它(绘制的盒子没有移动,只有灯光的效果)。