【问题标题】:How to get homogeneous screen space coordinates in openGL如何在openGL中获得均匀的屏幕空间坐标
【发布时间】:2018-06-16 08:00:42
【问题描述】:

我正在研究 opengl,并且我有一些带有一些对象的小 3d 场景。在 GLSL 顶点着色器中,我将矩阵上的顶点相乘,如下所示:

vertexPos= viewMatrix * worldMatrix * modelMatrix * gl_Vertex;
gl_Position = vertexPos;

vertexPos 是一个 vec4 可变变量,我将它传递给片段着色器。 以下是场景正常渲染的方式: normal render

但是我想进行调试渲染。我在片段着色器中写:

gl_FragColor = vec4(vertexPos.x, vertexPos.x, vertexPos.x, 1.0); 

vertexPos 乘以所有矩阵,包括透视矩阵,我假设我会得到从屏幕中心到右边缘的平滑渐变,因为它们被映射为 -1 到 1 平方。但看起来它们在屏幕空间中,但没有应用透视变形。这是我看到的: (不要看红线和光源,它们使用不同的着色器)

debug render

如果我将它除以大约 15,它将看起来像这样:

gl_FragColor = vec4(vertexPos.x, vertexPos.x, vertexPos.x, 1.0)/15.0;

devided by 15

谁能解释一下,为什么坐标不均匀,场景仍然正确渲染,透视失真? 附言如果我尝试将 gl_Position 放在片段着色器而不是 vertexPos 中,它不起作用。

【问题讨论】:

    标签: c++ qt opengl glsl qopenglfunctions


    【解决方案1】:

    在顶点着色器中计算之后,将所谓的透视分割应用于gl_Position

    gl_Position.xyz /= gl_Position.w;
    

    但除非您手动执行,否则您的变量不会发生这种情况。因此,您需要添加

    vertexPos.xyz /= vertexPos.w;
    

    在顶点着色器的末尾。确保在将值复制到gl_Position 之后执行此操作,您不想进行两次除法。

    【讨论】:

    • 谢谢,成功了!如果我想执行反向操作怎么办?我将坐标乘以逆矩阵,但是如何处理 W 分量?我尝试将 xyz 与 w 相乘和相除,但这给出了奇怪的结果..
    • @3dmodels 如果需要,您可能需要先执行pos.xyz *= pos.w; 来取消除法,然后乘以逆矩阵。
    猜你喜欢
    • 2020-04-03
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2011-11-21
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多