为什么OpenTK的默认视图空间从-1到1 ?



我正在用下面的代码渲染一个纹理:

        if (beganDraw)
        {
            beganDraw = false;
            GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0);
            if (CameraMaterial != null)
            {
                GL.BindBuffer(BufferTarget.ArrayBuffer, screenMesh.VBO);
                GL.BindVertexArray(VAO);
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, screenMesh.VEO);
                CameraMaterial.Use();
                screenMesh.ApplyDrawHints(CameraMaterial.Shader);
                GL.DrawElements(PrimitiveType.Triangles, 6, DrawElementsType.UnsignedInt, 0);
                GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
                GL.BindVertexArray(0);
                GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
                GL.UseProgram(0);
            }
        }

如你所见,没有变换矩阵

我创建网格来渲染表面,像这样:

        screenMesh = new Mesh();
        screenMesh.SetVertices(new float[] {
            -1,-1,
            1,-1,
            1,1,
            -1,1
        });
        screenMesh.SetIndices(new uint[] {
            2,3,0,
            0,1,2
        });

我的问题是,为什么我必须从-1到1才能填满屏幕?它的默认值不应该是0到1吗?还有,我怎样才能使它从0到1?或者有人建议这么做吗?

这是着色器:

[Shader vertex]
#version 150 core
in vec2 pos;
out vec2 texCoord;
uniform float _time;
uniform sampler2D tex;
void main() {
    gl_Position = vec4(pos, 0, 1);
    texCoord = pos/2+vec2(0.5,0.5);
}

[Shader fragment]
#version 150 core
#define PI 3.1415926535897932384626433832795
out vec4 outColor;
uniform float _time;
uniform sampler2D tex;
in vec2 texCoord;
//
void main() {
    outColor = texture2D(tex, texCoord);
}

OpenTK GL.调用只是OpenGL之上的一个薄层。你的问题是关于OpenGL坐标系统的

当你在顶点着色器中应用了所有的转换后,并将所需的顶点坐标分配给gl_Position,这些坐标在OpenGL文档中称为剪辑坐标。然后除以四分量坐标向量的w分量,得到归一化设备坐标(通常缩写为NDC)。

NDC在每个坐标方向的范围为[-1.0,1.0]。我不知道确切的原因是什么,但这就是OpenGL最初设计时定义的方式。我一直认为把坐标系统的原点放在3D渲染视图的中心是很自然的,所以它看起来至少和其他任何可以使用的东西一样合理。

因为你没有在你的顶点着色器中应用任何转换,并且你的坐标的w分量是1.0,你的输入位置需要在NDC中,这意味着范围为[-1.0,1.0]。

如果你在顶点着色器中应用相应的映射/转换,你可以很容易地使用不同的范围。如果你喜欢使用[0.0,1.0]作为你的x和y范围,你只需通过改变你分配给gl_Position的值来添加映射到你的顶点着色器:

gl_Position = vec4(2.0 * pos - 1.0, 0.0, 1.0);

这个线性映射0.0到-1.0,1.0到1.0。

最新更新