1

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

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

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

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

4

2 回答 2

2

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

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

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

于 2013-02-24T23:43:31.630 回答
0

你应该画很多平行的四边形而不是画一个单一的 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();
}

现在你会得到你想要的。更多细节可以在这里找到

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

于 2019-03-05T08:22:48.487 回答