首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL NDC和坐标

OpenGL NDC和坐标
EN

Stack Overflow用户
提问于 2018-03-13 18:00:08
回答 1查看 2.5K关注 0票数 2

虽然我对OpenGL比较陌生,但我在矩阵代数、齐次坐标、旋转和投影方面没有问题。我已经建立了我的mvp矩阵,以获得一个良好的视图立方体和它呈现得很好。

接下来,我将尝试从背景图像中读取颜色,而不是呈现立方体。正如预期的那样,纹理被呈现到立方体所在的位置,但由于某种原因存在相当大的失真。(按照评论中的建议,我现在除以w认为是OpenGL做到了这一点。)

据我所知,NDC中的xy坐标应该线性映射到窗口上。扭曲从何而来?

顶点着色器:

代码语言:javascript
复制
#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;
}

碎片着色器:

代码语言:javascript
复制
#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);
}

结果

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-13 22:55:53

据我所知,NDC中的xy坐标应该线性映射到窗口上。扭曲从何而来?

gl_Position是一个齐次坐标,你必须做一个透视划分

代码语言:javascript
复制
v_ndc = gl_Position.xy/gl_Position.w

注意,gl_Position.xy是剪贴画空间的辅助性。通过与剪辑坐标的w分量除法,将剪辑空间中的坐标转换为(-1,-1,-1)到(1,1,1)范围内的归一化设备坐标(NDC)。

仍然存在扭曲。

这是因为v ndc的插值是在透视图中完成的。它基于三角形原语的重心坐标,由gl_Position在透视图中定义。

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

顶点着色器:

代码语言:javascript
复制
noperspective out vec2 v_ndc;

破片着色机

代码语言:javascript
复制
noperspective in vec2 v_ndc;

另见OpenGL插值限定符

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49262877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档