我很长一段时间推迟修复我在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功能在灯光的位置周围绘制一个简单的框。它工作正常,我甚至实施了一些运动,如地球周围的太阳。虽然相机没有移动,但这很有效。但是一旦我转动相机,灯光不再显示它应该具有的东西,它似乎“移动”了光线而没有实际移动它(绘制的盒子没有被移动,只有光线的效果)。 p>
答案 0 :(得分:1)
根据glLight的OpenGL spec和GL_POSITION参数:
GL_POSITION: params包含四个整数或浮点值,用于指定均匀对象坐标中灯光的位置。整数和浮点值都直接映射。整数和浮点值都不会被钳制。
当调用glLight时,模型视图矩阵会转换位置(就好像它是一个点),并将其存储在眼睛坐标中。 如果位置的w分量为0,则将灯光视为方向源。漫反射和高光照明计算考虑光的方向,但不考虑其实际位置,并禁用衰减。否则,漫反射和高光照明计算基于眼睛中光的实际位置坐标和衰减已启用。初始位置为(0,0,1,0);因此,初始光源是方向的,平行的,并且在-z轴的方向上。
你只通过三个花车。我不能确定OpenTK使用什么作为第四个(w)组件,但我猜它会使任何未指定的参数为0,从而使你的光线方向性并忽略你给出的位置。我会尝试在你传入的数组的末尾添加一个1.0,看看是否能解决问题。