Ошибка при вызове glGetTexImage (atioglxx.dll) - PullRequest
5 голосов
/ 06 апреля 2011

У меня возникла трудная проблема на некоторых картах ATI (Radeon X1650, X1550 + и др.).

Сообщение: «Нарушение доступа по адресу 6959DD46 в модуле« atioglxx.dll ».адрес 00000000 "

Это происходит в этой строке:

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_FLOAT,P);

Примечание:

  • Установлены последние графические драйверы.
  • Работает отличнона других картах.

Вот что я уже пробовал (с утверждениями в коде):

  • То, что указатель P действителен и выделил достаточно памяти для хранения изображения
  • Текстурирование включено: glIsEnabled (GL_TEXTURE_2D)
  • Проверка того, что текущая привязанная текстура соответствует ожидаемой: glGetIntegerv (GL_TEXTURE_2D_BINDING)
  • Проверка того, что текущая связанная текстура имеет размерыЯ ожидаю: glGetTexLevelParameteriv (GL_TEXTURE_WIDTH / HEIGHT)
  • Проверка отсутствия сообщений об ошибках: glGetError

Он проходит все эти проверки, а затем все еще дает сбой с сообщением.

Я чувствую, что все перепробовал и идей больше нет.Я действительно надеюсь, что некоторые GL-гуру здесь могут помочь!

РЕДАКТИРОВАТЬ:

После того, как пришли к выводу, что это, вероятно, ошибка драйвера, я также написал об этом здесь: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=295137#Post295137

Iтакже попробовал GL_PACK_ALIGNMENT, и это не помогло.

Еще одним исследованием я обнаружил, что это произошло только с текстурами, которые я ранее заполнил пикселями, используя вызов glCopyTexSubImage2D.Поэтому я мог бы обойти эту проблему, заменив вызов glCopyTexSubImage2d вызовами glReadPixels, а затем вместо этого glTexImage2D.

Вот мой обновленный код:

{
  glCopyTexSubImage2D cannot be used here because the combination of calling
  glCopyTexSubImage2D and then later glGetTexImage on the same texture causes
  a crash in atioglxx.dll on ATI Radeon X1650 and X1550.
  Instead we copy to the main memory first and then update.
}
//    glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, PixelWidth, PixelHeight);  //**
GetMem(P, PixelWidth * PixelHeight * 4);
glReadPixels(0, 0, PixelWidth, PixelHeight, GL_RGBA, GL_UNSIGNED_BYTE, P);
SetMemory(P,GL_RGBA,GL_UNSIGNED_BYTE);

Ответы [ 2 ]

1 голос
/ 27 мая 2011

Вы можете позаботиться о GL_PACK_ALIGNEMENT.Этот параметр говорит вам самое близкое число байтов для упаковки текстуры.То есть, если у вас есть изображение 645 пикселей:

  • Если GL_PACK_ALIGNEMENT равен 4 (значение по умолчанию), у вас будет 648 пикселей.
  • При GL_PACK_ALIGNEMENT равному 1, вы получитеимеет 645 пикселей.

Поэтому убедитесь, что с пакетом все в порядке, выполнив:

glPixelStorei(GL_PACK_ALIGNMENT, 1)

Перед вашим glGetTexImage () или выровняйте текстуру памяти по GL_PACK_ALIGNEMENT.

0 голосов
/ 27 мая 2011

Скорее всего, это ошибка драйвера.Написав 3D apis самостоятельно, даже легко увидеть, как это сделать.Вы делаете что-то действительно странное и редко встречающееся в тесте: конвертируйте данные с плавающей запятой в 8-битные во время загрузки.Никто не собирается оптимизировать этот путь.Вы должны пересмотреть то, что вы делаете в первую очередь.Функция преобразования общего процессора преобразования, вероятно, включается, и кто-то испортил таблицу, которая управляет выделением временных буферов для этого.Вы должны действительно пересмотреть использование внешнего формата с плавающей запятой с внутренним 8-битным форматом.Подобные преобразования в GL API обычно указывают на ошибки программирования.Если ваши данные являются плавающими, и вы хотите сохранить их как таковые, вам следует использовать плавающую текстуру, а не RGBA.Если вы хотите 8 бит, почему ваш ввод с плавающей запятой?

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