Opengl 为什么OpenTK中的默认视图空间从-1变为1?

Opengl 为什么OpenTK中的默认视图空间从-1变为1?,opengl,viewport,opentk,Opengl,Viewport,Opentk,我正在使用以下代码将纹理渲染到屏幕: if (beganDraw) { beganDraw = false; GL.BindFramebuffer(FramebufferTarget.Framebuffer, 0); if (CameraMaterial != null) { GL.BindBuffer(BufferTarget.Arra

我正在使用以下代码将纹理渲染到屏幕:

        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\u位置
后,这些坐标位于OpenGL文档中称为剪辑坐标的位置。然后将它们除以4分量坐标向量的
w
分量,以获得标准化设备坐标(通常缩写为NDC

对于每个坐标方向,NDC在[-1.0,1.0]范围内。我不知道确切的推理是什么,但这只是OpenGL最初设计时定义的方式。我一直认为将坐标系的原点放在三维渲染视图的中心是很自然的,因此它看起来至少和其他可能使用的方法一样合理

由于在顶点着色器中未应用任何变换,并且坐标的
w
分量为1.0,因此输入位置需要在NDC中,这意味着范围为[-1.0,1.0]

如果在顶点着色器中应用相应的映射/变换,则可以轻松使用不同的范围。如果要对x和y范围使用[0.0,1.0],只需通过更改指定给
gl\u Position
的值,将该映射添加到顶点着色器:

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

它线性地将0.0映射到-1.0,将1.0映射到1.0。

OpenTK
GL。
调用只是OpenGL顶部的一个薄层。所以你的问题是关于OpenGL坐标系的

在顶点着色器中应用所有变换并将所需顶点坐标指定给
gl\u位置
后,这些坐标位于OpenGL文档中称为剪辑坐标的位置。然后将它们除以4分量坐标向量的
w
分量,以获得标准化设备坐标(通常缩写为NDC

对于每个坐标方向,NDC在[-1.0,1.0]范围内。我不知道确切的推理是什么,但这只是OpenGL最初设计时定义的方式。我一直认为将坐标系的原点放在三维渲染视图的中心是很自然的,因此它看起来至少和其他可能使用的方法一样合理

由于在顶点着色器中未应用任何变换,并且坐标的
w
分量为1.0,因此输入位置需要在NDC中,这意味着范围为[-1.0,1.0]

如果在顶点着色器中应用相应的映射/变换,则可以轻松使用不同的范围。如果要对x和y范围使用[0.0,1.0],只需通过更改指定给
gl\u Position
的值,将该映射添加到顶点着色器:

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

它线性地将0.0映射到-1.0,将1.0映射到1.0。

OpenTK
GL。
调用只是OpenGL顶部的一个薄层。所以你的问题是关于OpenGL坐标系的

在顶点着色器中应用所有变换并将所需顶点坐标指定给
gl\u位置
后,这些坐标位于OpenGL文档中称为剪辑坐标的位置。然后将它们除以4分量坐标向量的
w
分量,以获得标准化设备坐标(通常缩写为NDC

对于每个坐标方向,NDC在[-1.0,1.0]范围内。我不知道确切的推理是什么,但这只是OpenGL最初设计时定义的方式。我一直认为将坐标系的原点放在三维渲染视图的中心是很自然的,因此它看起来至少和其他可能使用的方法一样合理

由于在顶点着色器中未应用任何变换,并且坐标的
w
分量为1.0,因此输入位置需要在NDC中,这意味着范围为[-1.0,1.0]

如果在顶点着色器中应用相应的映射/变换,则可以轻松使用不同的范围。如果要对x和y范围使用[0.0,1.0],只需通过更改指定给
gl\u Position
的值,将该映射添加到顶点着色器:

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

它线性地将0.0映射到-1.0,将1.0映射到1.0。

OpenTK
GL。
调用只是OpenGL顶部的一个薄层。所以你的问题是关于OpenGL坐标系的

在顶点着色器中应用所有变换并将所需顶点坐标指定给
gl\u位置
后,这些坐标位于OpenGL文档中称为剪辑坐标的位置。然后将它们除以4分量坐标向量的
w
分量,以获得标准化设备坐标(通常缩写为NDC

对于每个坐标方向,NDC在[-1.0,1.0]范围内。我不知道确切的推理是什么,但这只是OpenGL最初设计时定义的方式。我一直认为将坐标系的原点放在三维渲染视图的中心是很自然的,因此它看起来至少和其他可能使用的方法一样合理