У меня возникла трудная проблема на некоторых картах 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);