OpenGL的。移动光源

时间:2014-04-11 09:26:22

标签: c# opengl 3d opentk

在我的程序中,我使用OpenTK和C#。而且,我在光源方面遇到了麻烦。我无法将它绑在相机上。它只停留在固定位置。 这是glControl1_Load()的代码:

     float[] light_ambient = { 0.2f, 0.2f, 0.2f, 1.0f };
        float[] light_diffuse = { 1.0f, 1.0f, 1.0f, 1.0f };
        float[] light_specular = { 1.0f, 1.0f, 1.0f, 1.0f };
        float[] spotdirection = { 0.0f, 0.0f, -1.0f };

        GL.Light(LightName.Light0, LightParameter.Ambient, light_ambient);
        GL.Light(LightName.Light0, LightParameter.Diffuse, light_diffuse);
        GL.Light(LightName.Light0, LightParameter.Specular, light_specular);

        GL.Light(LightName.Light0, LightParameter.ConstantAttenuation, 1.8f);
        GL.Light(LightName.Light0, LightParameter.SpotCutoff, 45.0f);
        GL.Light(LightName.Light0, LightParameter.SpotDirection, spotdirection);
        GL.Light(LightName.Light0, LightParameter.SpotExponent, 1.0f);

        GL.LightModel(LightModelParameter.LightModelLocalViewer, 1.0f);
        GL.LightModel(LightModelParameter.LightModelTwoSide, 1.0f);
        GL.Enable(EnableCap.Light0);
        GL.Enable(EnableCap.Lighting);
        GL.Enable(EnableCap.DepthTest);
        GL.Enable(EnableCap.ColorMaterial);
        GL.ShadeModel(ShadingModel.Flat);

glControl1_Paint():

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref cameramatrix);
        GL.Light(LightName.Light0, LightParameter.Position, new float[]{0.0f, 0.0f, 0.0f, 1.0f});

如果我没有错,坐标光源存储在眼睛空间坐标中。那么,怎么了?

1 个答案:

答案 0 :(得分:0)

LoadIdentity而不是模型视图的相机矩阵。您的光源将始终与相机保持在同一位置。

"如果w值非零,则光是位置,(x,y,z)值指定均匀物体坐标中光的位置。 (见附录F)这个位置由模型视图矩阵转换并存储在眼睛坐标中。"

more details here寻找"示例5-7"