【发布时间】:2014-01-22 16:51:26
【问题描述】:
问题: 我正在尝试将单个 2D 图像映射到 3D 纹理。当我可视化输出时,OpenGL 会渲染一个漂浮在黑色背景中的白色纹理。为什么会这样?是否可以将 2D 图像映射到 3D 纹理?
我的目标是沿 z 维度放置多个 2D 图像以模拟一个体积。这种方法的一个例子在这个视频中:http://cvlab.epfl.ch/research/medical/em/synapses
尝试的方法: 我拍摄了 2D 图像并将它们映射到 2D 纹理。我还使用了 2D 纹理数组。这两种方法都提供了良好的结果。然而,当我尝试用相同的图像绘制 3D 纹理的表面时,我得到一个白色纹理漂浮在黑色空间中。
代码 我遵循了 NeHe 网站上提供的纹理映射教程。 http://nehe.gamedev.net/tutorial/lesson_06_texturing_update/47002/
除了这三个功能的改变外,程序中的其他一切(在网站的解决方案文件中存在)都是一样的。
... // header file declarations
#include <glext.h>
PFNGLTEXIMAGE3DPROC glTexImage3D;
GLuint texture;
int LoadGLTextures() // Load Bitmaps And Convert To Textures
{
/* load an image file directly as a new OpenGL texture */
texture = SOIL_load_OGL_texture("Data/NeHe.bmp",SOIL_LOAD_AUTO,
SOIL_CREATE_NEW_ID,S OIL_FLAG_INVERT_Y);
// "Data/NeHe.bmp"
if(texture == 0) {return false;}
glTexImage3D = (PFNGLTEXIMAGE3DPROC) wglGetProcAddress("glTexImage3D");
if (glTexImage3D == NULL)
{
printf("Error in line %d: Couldn't load glTexImage3D function. Aborting.\n", __LINE__);
return -1;
}
glBindTexture(GL_TEXTURE_3D, texture);
glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
//glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4096, 4096, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
return true;
}
int InitGL(GLvoid)
{
if (!LoadGLTextures())
{ return FALSE; }
glEnable(GL_TEXTURE_3D);
// glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH); //
glClearColor(0.0f, 0.0f, 0.0f, 0.5f); // Black Background
glClearDepth(1.0f); // Depth Buffer Setup
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective calculations
return TRUE; // Initialization Went OK
}
int DrawGLScene(GLvoid)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0.0f,0.0f,-5.0f);
glRotatef(xrot,1.0f,0.0f,0.0f);
glRotatef(yrot,0.0f,1.0f,0.0f);
glRotatef(zrot,0.0f,0.0f,1.0f);
// glBindTexture(GL_TEXTURE_2D, texture[0]);
glBindTexture(GL_TEXTURE_3D, texture);
glBegin(GL_QUADS);
glTexCoord3f(0.0f, 0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
glTexCoord3f(1.0f, 0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
glTexCoord3f(1.0f, 1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 0.0f);
glTexCoord3f(0.0f, 1.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 0.0f);
glEnd();
xrot+=0.3f;
yrot+=0.2f;
zrot+=0.4f;
return TRUE;
}
...
【问题讨论】:
-
当您注释掉纹理上传 (
glTexImage3D()) 时,您期望会发生什么? -
好吧,我想检查一下图像是否真的绑定到了纹理上。因此,我注释掉了该行并在
if(texture == 0)循环处设置了一个断点。没有设置断点,程序单步执行该代码。此外,取消注释该行也无济于事;输出还是一样的。