2016-05-10 7 views
0

Я работаю с простым DLL-плагином, где я вызываю glReadPixels, чтобы вернуть пиксели на экран. При вызове функции в DLL она не работала с ошибкой 1282 (GL_INVALID_OPERATION).Функция возврата функции glReadPixels 1282 (GL_INVALID_OPERATION)

Я решил запустить код в качестве консоли EXE, но ошибка все еще существует.

Что я делаю неправильно? Я использую Windows 10 с Retina экрана и мой код ниже:

int x2 = GetSystemMetrics(SM_CXSCREEN); 
int y2 = GetSystemMetrics(SM_CYSCREEN); 
GLvoid *imagePixelsArray = malloc((x2 *x2)*(y2* y2)*4); 
glReadPixels(0, 0,x2,y2, GL_RGBA, GL_UNSIGNED_BYTE, imagePixelsArray); 
cout << "ERROR is " << glGetError() << endl; 

я x2 *x2 и (y2* y2), потому что я использую экран Retina. Удаление также не решило проблему.

+3

У меня есть файл cookie, в котором говорится, что вы не вызываете его внутри действительного контекста GL. и даже если вы, десять файлов cookie говорят, что это не контекст, который соответствует всему экрану. –

+0

@JayKominek От Unity Я называю это функцией OnPostRender и, насколько я понимаю, он работает для других людей. Поскольку он не работает, я решил протестировать его самостоятельно с помощью консольного приложения. Можете ли вы предоставить ссылку или пример? Как я могу назвать это из действительного контекста GL? Для даун-голосования я не знаю, почему. – Programmer

+1

Имеет ли ['wglGetCurrentContext()'] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd374383%28v=vs.85%29.aspx) перед 'glReadPixels()' вернуть что-то другое, чем 'NULL'? – genpfault

ответ

3

Я работаю с простым DLL-плагином, где я вызываю glReadPixels для возврата пикселей на экран.

Вы пытаетесь сделать снимок экрана? Ваш фрагмент кода выглядит так, как вы пытаетесь. Вот что о glReadPixels OpenGL в:

Вы не можете делать скриншоты с glReadPixels!

До, включая Windows-XP, в какой-то реализации OpenGL было поведение, которое, если бы вы создали полноэкранное окно без набора фоновых кистей, создало контекст OpenGL и сделало его актуальным на нем, вы можете на самом деле получить скриншот благодаря графическому драйверу, не инициализирующему фреймбуфер окна, тем самым оставляя содержимое экрана «мусором», которое вы могли бы захватить.

Однако это по существу неопределенное поведение и glReadPixels предназначен для доставки пикселей, созданных только с помощью OpenGL.

С Windows Vista окна компонуются и больше не имеют общего на экране фреймбуфера, и этот неудобный способ создания скриншотов больше не работает. Это никогда не срабатывало для MacOS-X и X11 еще до того, как композиция была чем-то более часто, чем не работала.

+0

Да, я использую его как способ получить снимок экрана. Я делаю это в Windows, а не на Mac. Это, похоже, работает для других людей здесь. Http://answers.unity3d.com/questions/465409/reading-from-a-rendertexture-is-slow-how-to-improv.html Единственная проблема, с которой они столкнулись, заключается в ее запуске на Android, но он должен работать. – Programmer

+1

@Programmer Answer.unity3d OP пытался прочитать текстуру, которую они отображали, а не весь экран. OpenGL не может использоваться для выполнения полного screengrab, который включает в себя другие окна; для этого вам нужны API-интерфейсы для ОС. –

+0

@ColonelThirtyTwo Я думаю, что я читал что-то неправильно. Спасибо, что сообщили мне об этом. Я думаю, что это то, что я ищу. – Programmer

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