【问题标题】:OpenGL How to calculate worldspace coordinates from frustum aligned vectors?OpenGL如何从平截头体对齐向量计算世界空间坐标?
【发布时间】:2019-05-12 16:30:46
【问题描述】:

我是一名图形编程初学者,正在使用自己的引擎并尝试实现平截头体对齐的体积渲染。

这个想法是将多个平面渲染为横跨视锥的垂直切片,然后将这些平面的世界坐标用于程序体积。

将切片渲染为 3d 模型并使用顶点位置作为世界空间坐标可以正常工作:

//Vertex Shader  
gl_Position = P*V*vec4(vertexPosition_worldspace,1);
coordinates_worldspace = vertexPosition_worldspace;

结果:

但是,在截锥体空间中渲染切片并尝试对世界空间坐标进行逆向工程并没有得到预期的结果。我得到的最接近的是:

//Vertex Shader
gl_Position = vec4(vertexPosition_worldspace,1);
coordinates_worldspace = (inverse(V) * inverse(P) * vec4(vertexPosition_worldspace,1)).xyz;

结果:

我的猜测是,标准投影矩阵以某种方式摆脱了一些关键的深度信息,但除此之外,我不知道我做错了什么以及如何解决它。

【问题讨论】:

    标签: opengl matrix-inverse projection-matrix frustum volume-rendering


    【解决方案1】:

    嗯,你所说的“平截头体空间”的意思并不是 100% 清楚。我将假设它确实引用了 OpenGL 中的标准化设备坐标,其中视锥体(默认情况下)是轴对齐的立方体-1 <= x,y,z <= 1。我还将假设一个透视投影,因此 NDC z 坐标实际上是眼睛空间z双曲线函数。

    我的猜测是,标准投影矩阵以某种方式摆脱了一些关键的深度信息,但除此之外,我不知道我做错了什么以及如何解决它。

    不,OpenGL 中的标准透视矩阵看起来像

    ( sx   0   tx   0  ) 
    (  0  sy   ty   0  )
    (  0   0    A   B  )
    (  0   0   -1   0  )
    

    当您将其乘以 (x,y,z,1) 眼睛空间向量时,您会得到齐次剪辑坐标。只考虑 矩阵的最后两行作为单独的方程:

    z_clip = A * z_eye + B
    w_clip = -z_eye
    

    由于我们将透视除以w_clip 以从剪辑空间到 NDC,因此我们最终得到

    z_ndc = - A - B/z_eye
    

    这实际上是双曲线重新映射的深度信息——这样信息就被完全保留了。 (另请注意,我们也对xy 进行除法)。

    当您计算inverse(P) 时,您只需反转 4D -> 4D 同质映射。但是你会得到一个结果w,它又不是1,所以在这里:

    coordinates_worldspace = (inverse(V) * inverse(P) * vec4(vertexPosition_worldspace,1)).xyz;
                                                                                           ^^^
    

    是您的信息丢失。您只需跳过生成的 w 并使用 xyz 组件,就好像它是笛卡尔 3D 坐标一样,但它们是代表某个 3D 点的 4D 齐次坐标。

    正确的做法是除以w:

    vec4 coordinates_worldspace = (inverse(V) * inverse(P) * vec4(vertexPosition_worldspace,1));
    coordinates_worldspace /= coordinates_worldspace.w
    

    【讨论】:

    • 非常感谢!有用!我对此并不陌生,并认为 w 仅对区分位置和向量有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2017-12-11
    相关资源
    最近更新 更多