OpenGL:不确定为什么这段代码会在窗口的左下角呈现一个绿色正方形

OpenGL:不确定为什么这段代码会在窗口的左下角呈现一个绿色正方形,opengl,opentk,Opengl,Opentk,我对LootAt函数调用的理解是,之后,我的相机将漂浮在原点上方一个单位的位置上,向下直视原点。因此,当我第一次渲染绿色正方形时,我希望它靠近窗口的中心,因为原点在那里(它的一个顶点是(0,0))。但它不是,它在左下角的窗户里。于是我想,也许因为调用LoadIdentity和Orthoro,所有顶点都将以窗口左下角的偏移量进行渲染,我的眼睛和相机的概念将不再适用。然而,如果我把眼睛的起始坐标放在(2,2)处,绿色的正方形似乎会平移。因此,我认为眼睛/照相机的概念仍然适用 所以现在我很困惑 你能解

我对LootAt函数调用的理解是,之后,我的相机将漂浮在原点上方一个单位的位置上,向下直视原点。因此,当我第一次渲染绿色正方形时,我希望它靠近窗口的中心,因为原点在那里(它的一个顶点是(0,0))。但它不是,它在左下角的窗户里。于是我想,也许因为调用LoadIdentity和Orthoro,所有顶点都将以窗口左下角的偏移量进行渲染,我的眼睛和相机的概念将不再适用。然而,如果我把眼睛的起始坐标放在(2,2)处,绿色的正方形似乎会平移。因此,我认为眼睛/照相机的概念仍然适用

所以现在我很困惑

你能解释一下发生了什么事吗


谢谢

如果您将投影矩阵设置为正交矩阵(GL.Ortho),它会将所有内容渲染到参数指定的屏幕空间:

(左、右、下、上、近、远)

你的屏幕可能比这个区域大,所以这将是屏幕的左下角,它将相机可以看到的东西渲染到这个正方形上。我使用的相机只能看到绿色的正方形,当你平移正方形时,它会超出相机视图,所以不会完全在这个区域内绘制


如果要绘制到屏幕中间,可以通过更改参数来移动视口。

您已经创建了一个偏离中心的正交投影:

protected override void OnRenderFrame(FrameEventArgs e)
{
        base.OnRenderFrame(e);

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        Matrix4 modelview = Matrix4.LookAt(0, 0, 1, 
                                           0, 0, 0, 
                                           0, 1, 0);
        GL.MatrixMode(MatrixMode.Modelview);
        GL.LoadMatrix(ref modelview);

        GL.MatrixMode(MatrixMode.Projection);
        GL.LoadIdentity();
        GL.Ortho(0, 320, 0, 480, 1, 2);

        GL.Begin(BeginMode.Quads);

        GL.Color3(0f, .8f, 0f);

        GL.Vertex2(0, 10);
        GL.Vertex2(10, 10);
        GL.Vertex2(10, 0);
        GL.Vertex2(0, 0);

        GL.End();

        SwapBuffers();
    }
简而言之,窗口原点(0,0)位于屏幕的左下角。如果要将其移动到中心,请使用类似以下内容:

   GL.Ortho(left, right, bottom, top, near, far);

   GL.Ortho(0, 320, 0, 480, 1, 2);
   GL.Ortho(-160, 160, -240, 240, 1, 2);