【问题标题】:Display voxels using shaders in openGL在 openGL 中使用着色器显示体素
【发布时间】:2014-06-24 19:19:09
【问题描述】:

我正在使用渲染管道进行体素化,现在我使用顶点+几何+片段着色器成功地对场景进行了体素化。现在我的体素存储在 3D 纹理中,其大小为 128x128x128。

我的场景原始模型以 (0,0,0) 为中心,并沿正轴和负轴延伸。然而,纹理在 tex 坐标中以 (63,63,63) 为中心。

我实现了一个简单的光线跟踪来进行可视化,但它没有考虑相机的移动(我只能从非常固定的位置进行渲染,因为我的光线必须考虑到 3D 纹理的不同坐标来生成)。

我的问题是:如何映射我的光线,以便它们在我的 3D 模型坐标中以方向 D 的点 Po 生成,但在纹理坐标中的相应位置与体素相交,并且相机在3D 世界在体素坐标中重新映射?

现在我以这种方式生成光线: 在相机前面的位置 (63,63,-20) 创建一个四边形 向 (63,63,3) 方向投射光线

【问题讨论】:

    标签: c++ opengl 3d textures voxel


    【解决方案1】:

    我认为您应该将整个视图变换矩阵存储在着色器统一参数中。然后对于每个着色器执行,您可以使用其屏幕坐标和视图变换来计算特定像素的视图光线方向。 拥有与当前相同的光线方向和相机位置即可。

    您还可以尝试另一种方法:

    假设您有一个立方体 (0,0,0)->(1,1,1),并且您根据其位置为每个角分配颜色,例如 (1,0,0) 是红色等.

    现在,对于每一帧,您都将立方体正面绘制到纹理,并将立方体背面绘制到第二个纹理。

    在最终渲染中,您可以使用这两种纹理来获得 enterexit 3D 矢量,它们已经在纹理空间中,这使您的最终着色器更加简单。

    你可以在这里阅读更好的描述:

    http://graphicsrunner.blogspot.com/2009/01/volume-rendering-101.html

    http://web.cse.ohio-state.edu/~tong/vr/

    【讨论】:

    • 是的,我以这种方式解决了这个问题,我传递了与实际世界相同的视图矩阵,但在之前反转它,然后在片段着色器中我通过再次变换光线来获取纹理坐标(简单的翻译)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多