删除现有纹理并加载新纹理

时间:2011-08-13 18:27:50

标签: opengl textures

我想在运行时加载一个新纹理,替换现有的加载纹理。我看过一个类似的问题(Loading new texture into already defined texture name),但似乎找不到解决方案。

我正在尝试加载新的3D纹理,替换用于在Cg着色器中绘制卷的现有3D纹理。但是,当加载新体积(或3d纹理)时,仍会绘制旧体积。我通过执行以下操作来创建纹理:

glGenTextures(1, &volume_texture);
glBindTexture(GL_TEXTURE_3D, volume_texture);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);

glTexImage3D(GL_TEXTURE_3D, 0, GL_INTENSITY, WIDTH, HEIGHT, DEPTH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, volumeData);

当我加载新纹理时,我执行以下操作(其中volumeData包含新的纹理纹理信息):

glBindTexture(GL_TEXTURE_3D, volume_texture);

glTexImage3D(GL_TEXTURE_3D, 0, GL_INTENSITY, WIDTH, HEIGHT, DEPTH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, volumeData);

我已经尝试过glDeleteTextures在加载新纹理之前删除现有纹理,但它没有任何区别。

正确加载纹理的数据,因为在创建纹理之后,相同的数据用于构建八叉树,该八叉树在表示加载的体积时正确构建。

为了渲染,我将3D纹理传递给Cg着色器。每次绘制场景时都使用以下调用完成此操作

SetTextureParam("volumeTex", volumeTexture, fragment_main, param3);

void SetTextureParam(char* par, GLuint tex,const CGprogram &program,CGparameter param) 
{
    param = cgGetNamedParameter(program, par); 
    cgGLSetTextureParameter(param, tex); 
    cgGLEnableTextureParameter(param);
}

2 个答案:

答案 0 :(得分:0)

尝试使用

glBindTexture(GL_TEXTURE_3D, &volume_texture);
glTexSubImage3d(GL_TEXTURE_3D, 0, 0, 0, 0, WIDTH, HEIGHT, DEPTH, GL_LUMANANCE, GL_UNSIGNED_BYTE, newVolumeData)

newVolumeData是指向新卷数据的指针。

答案 1 :(得分:0)

volumeTexture调用中SetTextureParam("volumeTex", volumeTexture, fragment_main, param3);变量来自哪里,我确保这与volume_texture

中使用的glGenTextures匹配
相关问题