将着色器应用于曲面(纹理)

时间:2014-04-12 21:21:26

标签: opengl shader surface opentk

我正在研究一个基于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);
        }
    }

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

1 个答案:

答案 0 :(得分:0)

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

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

当你的顶点正好在近平面上时,你会在某个地方除以0,你也可以在z轴上进一步移动。