OpenTK(OpenGL)不会绘制大多数原语

时间:2011-01-10 10:28:55

标签: c# .net opengl opentk

我最近开始在C#中使用OpenTK进行简单的游戏 但是我似乎无法绘制基本的形状,比如我尝试了很多东西,但是我无法弄明白。

我的绘图程序目前看起来像这样:

public static void RenderLoop(object Sender, OpenTK.FrameEventArgs Fea)
{
    OpenTK.Graphics.OpenGL.GL.Clear(OpenTK.Graphics.OpenGL.ClearBufferMask.ColorBufferBit | OpenTK.Graphics.OpenGL.ClearBufferMask.DepthBufferBit);

    OpenTK.Graphics.OpenGL.GL.Disable(OpenTK.Graphics.OpenGL.EnableCap.PointSmooth);
    OpenTK.Graphics.OpenGL.GL.Disable(OpenTK.Graphics.OpenGL.EnableCap.Blend);
    OpenTK.Graphics.OpenGL.GL.Disable(OpenTK.Graphics.OpenGL.EnableCap.DepthTest);
    OpenTK.Graphics.OpenGL.GL.Disable(OpenTK.Graphics.OpenGL.EnableCap.CullFace);

    OpenTK.Graphics.OpenGL.GL.Begin(OpenTK.Graphics.OpenGL.BeginMode.Points);
    OpenTK.Graphics.OpenGL.GL.Color3(1f, 1f, 1f);
    OpenTK.Graphics.OpenGL.GL.Vertex2(50, 50);
    OpenTK.Graphics.OpenGL.GL.End();


    OpenTK.Graphics.GraphicsContext.CurrentContext.SwapBuffers();
}

初始化是这样的:

    public static bool Init()
    {
        try
        {
            //1200,850

            GameWnd = new GameWindow(1200, 850, new GraphicsMode(new ColorFormat(32), 0), "OpenTK - OpenGL Renderer", GameWindowFlags.Default, DisplayDevice.Default,3,0,GraphicsContextFlags.Default);

            GL.Disable(EnableCap.DepthTest); //Disable Z-Buffer, 2D Rendering
            GL.Disable(EnableCap.CullFace);
            GL.Enable(EnableCap.Texture2D);
            GL.Enable(EnableCap.Blend);
            GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
            GL.PixelStore(PixelStoreParameter.UnpackAlignment, 1);
            GL.RenderMode(RenderingMode.Render);

            GL.MatrixMode(MatrixMode.Projection);

            return true;
        }
        catch (Exception ex)
        {
            ErrorHandler.Err(ex, "Renderer has failed to initialize");
            return false;
        }
    }

1 个答案:

答案 0 :(得分:2)

我认为这个问题正如马库斯暗示的那样;你没有将投影矩阵设置为任何有用的东西(而不是将模型视图矩阵设置为任何东西)。如果保留为标识,则(50,50)将位于视图窗口之外。我建议你查看glOrtho和glFrustum的OpenTK映射。

假设您有一个按高度调整大小的视口,下面的内容将设置一个视口,其中(0,0)是左上角,(a,b)是右边的像素,下面是b像素:

glOrthof(0, width, height, 0, 1, 10);

虽然这会将近剪裁平面放在观察者的深度1处(并且距离深度为10),所以你可能也想在初始化时做这样的事情:

glMatrixMode(GL_MODELVIEW);
glTranslatef(0.0f, 0.0f, -5.5f);

将您在2d中指定的任何未来几何体移动到两个剪裁平面之间的正好位置。