Почему использование glReadBuffer / glReadPixels возвращает черное изображение на картах Intel?


8

У меня есть этот кусок кода

glReadBuffer( GL_FRONT );
glReadPixels( 0, 0, width, height, GL_RGB, GL_UNSIGNED_BYTE, buffer ); 

Это прекрасно работает во всех видеокартах Nvidia и AMD, которые я пробовал, но не работает почти во всех встроенных видео Intel, которые я пробовал. На самом деле он работает в очень старом 945GME, но не работает во всех остальных. Вместо скриншота я получаю черный экран.

Если это помогает, я работаю с движком Doom3, и этот код получен из встроенного кода захвата экрана. Кстати, даже с оригинальной игрой я не могу делать снимки экрана на этих устройствах Intel в любом случае. Я предполагаю, что они не реализуют стандарт правильно или что-то. Есть ли обходной путь для этого?


1
Можете ли вы привести несколько конкретных примеров сбоя встроенных видеочипсетов Intel? Просто мы все уверены, что говорим об одном и том же. (Кстати, мой код очень похож на ваш)
Тревор Пауэлл,

Я использовал Intel 945,965, GMA HD и ни один из них не работал. Они были в одних вдохновителях 1525 года, в другом - в 1769 году. Тот, который работал, был очень старый Intel 950 от Acer Aspire One 110L. Вы смогли это исправить?
Cloudraven

3
Может быть, вам нужно читать из буфера GL_BACK? Руководства OpenGL говорят, что это режим по умолчанию для режима двойной буферизации. Но для справки приведенный выше код (с GL_FRONT или GL_BACK) работал на моей карте Intel HD.
QuasarDonkey

Я попробую это завтра. Странно, разве это не должно быть неопределенным поведением? Ну, я могу сделать это только на картах Intel.
Cloudraven

Cloudraven, я бы проверил RB_ExecuteBackEndCommands из tr_backend.cpp для случаев, когда backbuffer может быть очищен до вашего вызова ReadPixels.
Цзин

Ответы:


4

Исторически у графики Intel всегда были проблемы с чтением или обращением к переднему буферу. Хорошее практическое правило, которому я следую в Intel, таково: если вы не можете сделать это в D3D, то даже не пытайтесь делать это в OpenGL, даже если в спецификации сказано, что вы должны это делать, а D3D этого не делает. разрешить доступ к переднему буферу таким образом, так что ... просто используйте вместо этого GL_BACK.


Да, я бы предпочел использовать GL_BACK, но GL_FRONT. Просто GL_BACK не работает. Как ни странно, GL_FRONT, кажется, работает, но я не проверил это полностью.
облачный ворон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.