Я хочу загрузить новую текстуру во время выполнения, заменив существующую загруженную текстуру.Я смотрел на похожий вопрос ( Загрузка новой текстуры в уже определенное имя текстуры ), но, похоже, решения не найдено.
Я пытаюсь загрузить новую 3D-текстуру, заменяя существующую3D текстура используется для рисования объема в Cg шейдере.Однако, когда новый том (или 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);
Iпопытался 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);
}