2015-06-16 2 views
0

Я пытаюсь изменить размер QOpenGLTextures, сохраняя указанные свойства. Я знаю, что, когда это возможно, используется неизменяемое хранилище. Поэтому мне нужно уничтожить и воссоздать текстуру. Но, похоже, QOpenGLTexture теряет свои свойства после уничтожения.Изменение размеров свойств сохранения QOpenGLTexture

void resizeTexture(std::shared_ptr<QOpenGLTexture> texture, const Qsize &size){ 
    texture->destroy(); 
    texture->setSize(size.width(),size.height()); 
    texture->create(); 
    texture->allocateStorage(); 
} 

Выполняя texture->allocateStorage(); выписку разжигает в QOpenGLDebugLogger печати следующего: Warning: GL_INVALID_ENUM in glTexStorage2D(internalformat = GL_FALSE)

Так что, мне кажется, что ранее выставиться свойства, такие как цели текстур теряются после разрушения текстуры. Поэтому в моем варианте они должны быть сохранены для возможного восстановления текстуры.

Возможно, существует еще один способ создания второй QOpenGLTexture с идентичными свойствами, кроме размера?

Я подал сообщение об ошибке в багтрекер Qt, но, похоже, разработчики не смогли взглянуть на него. https://bugreports.qt.io/browse/QTBUG-46614

Возможно, у кого-то есть намек на меня, что делать?

ответ

1

Я использую Qt и OpenGL довольно много. Но я никогда не использовал классы оболочки Qt GL, и я также не рекомендую использовать их, потому что таким образом вы полагаетесь на то, что происходит под капотом внутри Qt SDK. Также из-за некоторых недостатков в дизайне API указано в this discussion, а также here. Но о вашей проблеме. Кажется, что Qt делает это правильно (другая причина, почему напрямую использовать GL API), как это предусмотрено стандартом OpenGL. То есть, если дескриптор текстуры будет уничтожен или повторно инициализирован, что необходимо сделать, если вам нужно изменить размер, тогда все реквизиты объектов текстуры будут признаны недействительными. Это так, как должно работать. Btw, если вы хотите сохранить свойства сэмплера текстур, вы можете использовать OpenGL sampler objects. И да, я понятия не имею, как использовать те, у которых API-интерфейс оболочки Qt GL.

+0

Спасибо за ваш ответ. Я переработал свой проект, чтобы иметь возможность воссоздавать текстуры со всеми свойствами при возникновении события изменения размера. – cguenther

+0

Существует одно преимущество классов оболочки OpenGL Qt: если ваш код вписывается в смирительную рубашку OpenGL ES 2, он может работать на DirectX через слой перевода (ANGLE) в комплекте с Qt. Qt уже обрабатывает динамический выбор ANGLE и native GL, и вы можете дополнительно переопределить такой выбор во время выполнения. Иногда это полезно. –

+0

@KubaOber Согласитесь, но я говорю это с точки зрения разработчика OpenGL :) –

Смежные вопросы