我想在运行时加载一个新纹理,替换现有的加载纹理。我看过一个类似的问题(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);
}
答案 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
匹配