OpenGL NDC和坐标

时间:2018-03-13 18:00:08

标签: opengl coordinates perspectivecamera

虽然我对OpenGL相对较新,但我对矩阵代数,齐次坐标,旋转和投影都没有问题。我已经设置了我的mvp矩阵来获得一个很好的立方体视图,它渲染得很好。

接下来,我试图从background image读取颜色,而不是渲染立方体。正如预期的那样,纹理会被渲染到立方体所在的位置,但由于某种原因会出现相当多的失真。 (根据评论中的建议,我现在除以w [认为OpenGL做了这个]。)

据我了解,NDC中的xy坐标应线性映射到窗口上。失真来自哪里?

顶点着色器:

#version 330
uniform mat4 Mvp;

in vec3 in_shape;

out vec2 v_ndc;

void main() {
    gl_Position = Mvp * vec4(in_shape, 1.0);
    v_ndc = vec2(
        gl_Position.x / gl_Position.w,
        -gl_Position.y / gl_Position.w
    ) / 2 + 0.5;
}

片段着色器:

#version 330
uniform sampler2D Background;

in vec2 v_ndc;

out vec4 f_color;

void main() {
    f_color = vec4(texture(Background, v_ndc).rgb, 1.0);
}

结果

enter image description here

1 个答案:

答案 0 :(得分:1)

  

据我了解,NDC中的xy坐标应线性映射到窗口上。失真来自哪里?

gl_PositionHomogeneous coordinate,您必须执行Perspective divide

v_ndc = gl_Position.xy/gl_Position.w

注意,gl_Position.xy是剪辑空间坐标。通过除以剪辑的w分量,剪辑空间中的坐标转换为范围(-1,-1,-1)到(1,1,1)范围内的规范化设备坐标(NDC)坐标。


  

仍有失真。

这是因为v ndc的插值是在透视图中完成的。它基于三角形基元的Barycentric coordinates,在透视图中由gl_Position定义。

使用noperspective在窗口空间中进行线性插值:

顶点着色器:

noperspective out vec2 v_ndc;

片段着色器

noperspective in vec2 v_ndc;

另见OpenGL Interpolation Qualifiers (GLSL)