Как поймать ошибку glTexImage2D, когда разрешение несовместимо?

Я пытаюсь поймать ошибку, возникающую из-за несовместимого разрешения текстуры изображения в

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, imgdata);


1. Compatible resolution, working fine = 1024x1024, 1920x1200, 1920x1080, 704x891
2. Incompatible resolutions, all giving error = 2058x1734, 1018x1280, 591x602, etc.

Я не знаю, почему glTexImage2D нормально работает с разрешением №1 и выдает ошибку с разрешением №2. Я не смог извлечь шаблон разрешения, которому он следует, что означает, что какое-то разрешение работает нормально, а какое-то нет. Я не знаю почему.

Теперь проблема в том, что если пользователь попытается создать текстуру с несовместимым разрешением, тогда OpenGL должен поймать ошибку, и я должен получить 0, если текстура не создана, но glTexImage2D ничего не возвращает, поэтому мы не можем сделать что-то безопасное для пользователя OK. «Это разрешение не поддерживается, не используйте его». Но проблема в том, что OpenGL не улавливает ошибку glTexImage2D.

Во время выполнения во время выполнения

cout<<until here working fine..<<endl;

glTexImage2D(......) run-time execution stops here and windows gives not responding error.

cout<<"output of something that never executed"<<endl;
Here If I use glGetError() it never works. Because windows gives error in glTexImage2D.

Итак, кто-нибудь знает, как я могу поймать ошибку glTexImage2D. Если это дает ошибку, я показываю OK «Не использовать это изображение, используйте другое». и вернуть 0.

Как достичь этой задачи? Я также думал о том, чтобы ограничить пользователя только некоторыми разрешениями, но это не решение. Верно ?


person maxpayne    schedule 22.12.2012    source источник
comment
Что касается шаблона, я вижу только то, что нерабочие текстуры не кратны 4 пикселям в ширину.   -  person JasonD    schedule 22.12.2012
comment
Я так думаю, вы правы. Так вы думаете, я могу ограничивать таким образом? if(imgW%4 == 0) создайте текстуру. Верно ?   -  person maxpayne    schedule 22.12.2012
comment
Вы не должны, похоже, есть другая основная проблема. Вы уверены, что данные вашего изображения действительны для этих нерабочих размеров? то есть ваш загрузчик изображений передает фиктивный указатель для glTexImage?   -  person JasonD    schedule 22.12.2012
comment
(хотя, если это действительно проблема с драйвером, и ограничение размера текстуры работает, какого черта - взлом лучше, чем сбой...)   -  person JasonD    schedule 22.12.2012
comment
Хорошо, что я только что сделал, я изменил размер несовместимого изображения на совместимое, и он отлично работает. Итак, в чем проблема сейчас?   -  person maxpayne    schedule 22.12.2012


Ответы (2)


Те форматы изображений, которые не принимаются в вашем случае, не кратны 4. Это приводит меня к вопросу: вы устанавливаете параметры хранения пикселей? Установите все параметры GL_UNPACK_… в соответствии с данными вашего изображения непосредственно перед вызовом glTexImage. GL_UNPACK_ALIGNMENT представляет особый интерес для вашей проблемы.

http://www.opengl.org/sdk/docs/man/xhtml/glPixelStore.xml

person datenwolf    schedule 22.12.2012
comment
Я понял вашу точку зрения, но куда поместить glPixelStorei(GL_UNPACK_ALIGNMENT, 1); непосредственно перед glTexImage2D()? или где ? - person maxpayne; 22.12.2012
comment
Ты прав. Я решил это с помощью glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // это так важно, чтобы избежать недопустимого разрешения изображения. Ширина изображения должна быть разделена на 4 в glTexImage2D (image-›width%4 == 0). glPixelStorei делает текстуры совместимыми. - person maxpayne; 22.12.2012
comment
@furqan: я написал в своем ответе, куда поместить вызовы glPixelStore. Я переформатировал уже существующую строфу жирным шрифтом для акцента. - person datenwolf; 22.12.2012

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

Обычно должно быть только три ограничивающих возможности в отношении допустимых текстур: соотношение сторон и размеры:

  • Текстура может быть слишком высокой или слишком широкой для обработки.
  • Старые карты могут требовать, чтобы текстуры были квадратными (ширина = высота).
  • Для старых карт может потребоваться, чтобы размер текстуры был равен степени двойки (ширина = 2n; высота = 2м).

Я не вижу никакого реального шаблона в ваших размерах текстуры.

Формат текстуры (то есть глубина цвета/цветовые каналы) может быть еще одной проблемой, но не думайте, что это на самом деле здесь.

person Mario    schedule 22.12.2012
comment
Я не использую старый графический процессор, это Nvidia GeForce GT 220 512 МБ. цвета или каналы здесь не проблема, потому что одно и то же изображение работает после изменения размера до совместимого разрешения. JasonD обнаружил, что ширина паттерна может быть разделена на 4. - person maxpayne; 22.12.2012