Удалить существующую текстуру и загрузить новую текстуру - PullRequest
1 голос
/ 13 августа 2011

Я хочу загрузить новую текстуру во время выполнения, заменив существующую загруженную текстуру.Я смотрел на похожий вопрос ( Загрузка новой текстуры в уже определенное имя текстуры ), но, похоже, решения не найдено.

Я пытаюсь загрузить новую 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);
}

Ответы [ 2 ]

0 голосов
/ 16 сентября 2011

Откуда берется переменная volumeTexture в вызове SetTextureParam("volumeTex", volumeTexture, fragment_main, param3);, я бы удостоверился, что это соответствует volume_texture, используемому в glGenTextures

0 голосов
/ 16 сентября 2011

Попробуйте использовать

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

newVolumeData - указатель на новые данные тома.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...