我有一个简单的3D立方体(所有边都相等)和OpenGL中的3D纹理。我想将3D纹理映射到立方体。
结果应该是一个立方体着色的立方体,这样立方体内的每个点都可以从纹理内部的相应点获得颜色。这至少是我对3D纹理的解释。
怎么做?我想用GL_QUADS(6个四边形)制作一个立方体并为六个边中的每个边指定一个纹理坐标是不行的?
我假设我必须制作一个立方体,同时使Cubing以正确的方式指定glTexCoord。
答案 0 :(得分:2)
您所描述的内容听起来像体素渲染,通常使用光线追踪。
不幸的是,3D纹理没有按照你的描述进行。虽然3D纹理对于每个纹素提取采用U,V,W,但OpenGL仍然沿着图元的平面绘制。您必须在片段着色器中编写一些光线跟踪代码以投射到3D纹理中。既然你有效地进行了光线追踪,你可能只需要放置一个平坦的(非旋转的)单个四边形(更好的是,两个三角形制作一个伪四边形,因为四边形不推荐使用),并用你的光线追踪东西写片段着色器代码
有关详细信息,请查看“直接体积渲染”。
答案 1 :(得分: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();
}
现在您将得到想要的东西。 可以找到更多详细信息here
前述方法是所谓的基于纹理的体绘制。但是,如果您要寻求更好的视觉效果和性能,光线投射将更适合您,并且使您可以遍历整个音量。