OpenGL NDC 和坐标
OpenGL NDC and coordinates
虽然我对 OpenGL 比较陌生,但我对矩阵代数、齐次坐标、旋转和投影没有任何问题。我已经设置了我的 mvp 矩阵以获得立方体的良好视图并且它呈现得很好。
接下来,我尝试从 background image 中读取颜色,而不是渲染立方体。正如预期的那样,纹理被裁剪到立方体所在的位置,但由于某种原因存在相当大的失真。 (根据评论中的建议,我现在除以 w
[认为 OpenGL 这样做了]。)
据我了解,NDC 中的 xy
坐标应线性映射到 window。失真从何而来?
顶点着色器:
#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);
}
结果
As far as I understand, the xy coordinates in NDC should map linearly onto the window. Where does the distortion come from?
gl_Position
is a Homogeneous coordinate you have to do a Perspective divide
v_ndc = gl_Position.xy/gl_Position.w
注意,gl_Position.xy
是剪辑space 坐标。剪辑 space 中的坐标通过除以 w
转换为 (-1, -1, -1) 到 (1, 1, 1) 范围内的标准化设备坐标 (NDC)剪辑坐标的分量。
There is still distortion.
这是因为v ndc
的插值是在透视中完成的。它是基于三角形基元的Barycentric coordinates,在透视中由gl_Position
定义的
使用noperspective
在window-space中进行线性插值:
顶点着色器:
noperspective out vec2 v_ndc;
片段着色器
noperspective in vec2 v_ndc;
虽然我对 OpenGL 比较陌生,但我对矩阵代数、齐次坐标、旋转和投影没有任何问题。我已经设置了我的 mvp 矩阵以获得立方体的良好视图并且它呈现得很好。
接下来,我尝试从 background image 中读取颜色,而不是渲染立方体。正如预期的那样,纹理被裁剪到立方体所在的位置,但由于某种原因存在相当大的失真。 (根据评论中的建议,我现在除以 w
[认为 OpenGL 这样做了]。)
据我了解,NDC 中的 xy
坐标应线性映射到 window。失真从何而来?
顶点着色器:
#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);
}
结果
As far as I understand, the xy coordinates in NDC should map linearly onto the window. Where does the distortion come from?
gl_Position
is a Homogeneous coordinate you have to do a Perspective divide
v_ndc = gl_Position.xy/gl_Position.w
注意,gl_Position.xy
是剪辑space 坐标。剪辑 space 中的坐标通过除以 w
转换为 (-1, -1, -1) 到 (1, 1, 1) 范围内的标准化设备坐标 (NDC)剪辑坐标的分量。
There is still distortion.
这是因为v ndc
的插值是在透视中完成的。它是基于三角形基元的Barycentric coordinates,在透视中由gl_Position
定义的
使用noperspective
在window-space中进行线性插值:
顶点着色器:
noperspective out vec2 v_ndc;
片段着色器
noperspective in vec2 v_ndc;