【问题标题】:Mapping a 2D image to a 3D texture将 2D 图像映射到 3D 纹理
【发布时间】: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) 循环处设置了一个断点。没有设置断点,程序单步执行该代码。此外,取消注释该行也无济于事;输出还是一样的。

标签: c++ opengl textures


【解决方案1】:

最好使用 3D 纹理而不是 2D 纹理,因为您将能够使用 glRotate() 正确应用旋转。您还需要进行混合和/或 alpha 测试以查看 2D 图像的不同层。

要创建 3D 纹理,您可以创建一个维度为 [width x height x number_of_slices] 的数组,然后逐个切片存储原始数据

看这个教程:http://www.codeproject.com/Articles/352270/Getting-started-with-Volume-Rendering?msg=4729498#xx4729498xx

这非常好,它对我做同样的事情很有效

【讨论】:

  • 但是,这就是我试图做的!我想将通过 SOIL 库加载的图像沿着 z 维度的插槽放置。当我渲染 3D 纹理层中的第一个切片时,它仍然是白色的!为什么会这样?
  • @Tejas 我遇到的问题之一与图形内存有关。使用板载 Intel HD3000 时出现白框,但使用 Nvidia GPU 时已解决
  • 嗯,我使用的是支持 3D 纹理的 Nvidia Quadro 5000 GPU。我不确定发生了什么。我查看了您发布的链接,这很有意义。我将尝试以此为基础。谢谢!
猜你喜欢
  • 2013-06-16
  • 2017-06-16
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-08-22
  • 2013-04-22
  • 1970-01-01
相关资源
最近更新 更多