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