0

我正在开发一个基于 OpenTK 的 2D 图形库,并且正在尝试将着色器应用于 Surface 对象:

public void ApplyTo(Surface surface)
    {
        using (Surface pong = new Surface())
        {
            pong.Create(surface.Width, surface.Height);
            pong.Clear(0, 0, 0, 0);

            GL.Viewport(0, 0, surface.Width, surface.Height);
            GL.LoadIdentity();
            GL.Ortho(0, 1.0, 1.0, 0.0, 0.0, 4.0);

            GL.UseProgram(0);
            surface.BindTexture();
            pong.BindFramebuffer();


            GL.Begin(PrimitiveType.Quads);
            GL.TexCoord2(0.0f, 1.0f);
            GL.Vertex3(0, 0, 0);
            GL.TexCoord2(0.0f, 0.0f);
            GL.Vertex3(0, 1, 0);
            GL.TexCoord2(1.0f, 0.0f);
            GL.Vertex3(1, 1, 0);
            GL.TexCoord2(1.0f, 1.0f);
            GL.Vertex3(1, 0, 0);
            GL.End();

            Use(); // calls GL.UseProgram()
            pong.BindTexture();
            surface.BindFramebuffer();

            GL.Begin(PrimitiveType.Quads);
            GL.TexCoord2(0.0f, 1.0f);
            GL.Vertex3(0, 0, 0);
            GL.TexCoord2(0.0f, 0.0f);
            GL.Vertex3(0, 1, 0);
            GL.TexCoord2(1.0f, 0.0f);
            GL.Vertex3(1, 1, 0);
            GL.TexCoord2(1.0f, 1.0f);
            GL.Vertex3(1, 0, 0);
            GL.End();

            GL.BindTexture(TextureTarget.Texture2D, 0);
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
        }
    }

这以某种方式清除了表面,而不是应用着色器。我的怀疑是我在视口/投影上做错了什么,但是什么?我希望提供的代码就足够了。

4

1 回答 1

0

对于四边形上的全屏渲染,我使用该投影:

OpenTK.Matrix4 ortho = OpenTK.Matrix4.CreateOrthographicOffCenter(-1, 1, -1, 1, 1, -1);

当您的顶点恰好在近平面上时,某处除以 0,您也可以在 z 轴上移动一点。

于 2014-04-17T22:54:13.850 回答