OpenGL:不确定为什么此代码在窗口的左下角呈现绿色方块

时间:2011-04-05 02:32:55

标签: opengl opentk

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();
    }

我对LootAt功能调用的理解是,之后我的相机会在原点上方浮动一个单位直视原点。因此,当我第一次渲染绿色方块时,我预计它会靠近窗口的中心,因为那里是原点(其中一个顶点是(0,0))。但事实并非如此,它位于左下角的窗口。所以我想也许因为对LoadIdentity和Orthoro的调用,所有顶点都会根据窗口左下角的偏移量进行渲染,并且我的眼睛和相机的概念将不再适用。但是,如果我把眼睛的起始坐标放在说(2,2)处,绿色正方形似乎会翻译。所以这让我觉得眼睛/相机的概念仍然适用。

所以现在我只是困惑......

你能告诉我发生了什么吗?

由于

2 个答案:

答案 0 :(得分:1)

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

(left,right,bottom,top,nearVal,farVal);

您的屏幕可能比这个区域大,所以这将是屏幕的左下角,它会呈现相机可以看到此方块的内容。我正在注意相机只能看到那个绿色方块,当你翻译方块时,它会移到相机视图之外,所以不能完全在这个区域内绘制。

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

答案 1 :(得分:0)

您创建了偏心正投影:

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

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

简而言之,您的窗口原点(0,0)位于屏幕的左下角。如果您希望将其移至中心,请使用以下内容:

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