【问题标题】:OpenGL 3D texture on cube立方体上的 OpenGL 3D 纹理
【发布时间】:2013-02-10 01:33:44
【问题描述】:

我在 OpenGL 中有一个简单的 3d 立方体(所有边大小相同)和一个 3D 纹理。我想将 3D 纹理映射到立方体。

结果应该是一个一直着色的立方体,这样立方体内的每个点都从纹理内的相应点获取颜色。这至少是我对 3D 纹理的解释。

如何做到这一点?我想用 GL_QUADS(6 个四边形)制作一个立方体并为六个边中的每一个指定一个纹理坐标是行不通的?

我假设我必须制作一个立方体,并且在制作立方体时以正确的方式指定 glTexCoord。

【问题讨论】:

    标签: opengl textures 3d-texture


    【解决方案1】:

    您所描述的内容听起来像是体素渲染,通常通过光线追踪完成。

    不幸的是,3D 纹理不符合您的描述。尽管 3D 纹理在每次提取纹理像素时都需要 U、V、W,但 OpenGL 仍然沿图元的平面进行绘制。您必须在片段着色器中编写一些光线跟踪代码才能投射到 3D 纹理中。由于您可以进行有效的光线跟踪,因此您最好只放置一个平面(非旋转)单四边形(更好的是,两个三角形制作一个伪四边形,因为不推荐使用四边形)并使用您的光线跟踪内容编写片段着色器代码.

    有关更多详细信息,请查看“直接体积渲染”。

    【讨论】:

    • 谢谢!现在我更好地理解了 3D 纹理到底是什么。
    • 浮雕映射并不是 OP 所需要的。 OP 想要的是“直接体积渲染”,也称为“体积光线投射”。有几种方法可以做到这一点。
    • @datenwolf 编辑了我的答案以反映您的建议。
    • ** 一个平面(非旋转)单四边形** 不足以追踪。对于两次通过的方法,正面(存储每条光线的入口点)和背面(存储每条光线的出口点)都需要。你应该画一个(3D)立方体两次。对于单通道方法,您可以根据您用于跟踪/投射的方向绘制其中任何一个。但是你还需要画一个立方体。对于基于纹理的方法,我贴的网站已经做了详细的描述。总之,绘制一个扁平的单四边形不适用于 DVR。
    【解决方案2】:

    你应该画很多平行的四边形,而不是画一个 Cude。

    例如,沿 z 轴绘制一系列四边形:

    #define MAP_3DTEXT( TexIndex ) \
    glTexCoord3f(0.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f);  \
    glVertex3f(-dViewPortSize,-dViewPortSize,TexIndex);\
    glTexCoord3f(1.0f, 0.0f, ((float)TexIndex+1.0f)/2.0f);  \
    glVertex3f(dViewPortSize,-dViewPortSize,TexIndex);\
    glTexCoord3f(1.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f);  \
    glVertex3f(dViewPortSize,dViewPortSize,TexIndex);\
    glTexCoord3f(0.0f, 1.0f, ((float)TexIndex+1.0f)/2.0f);  \
    glVertex3f(-dViewPortSize,dViewPortSize,TexIndex);
    
    
    
     for ( float fIndx = -1.0f; fIndx <= 1.0f; fIndx+=0.003f )
    {
        glBegin(GL_QUADS);
            MAP_3DTEXT( fIndx );
        glEnd();
    }
    

    现在你会得到你想要的。 更多详情可以找到here

    上述方法就是所谓的基于纹理的体积渲染。但是如果你追求更好的视觉效果和性能,Ray-Casting 会更合适,它可以让你穿越体积。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多