2015-11-17 45 views
1

我試圖在openGL的畫面保存到使用this解釋文件,但圖像我收到無效: enter image description here在OpenGL創建截圖不工作

什麼可以一個原因?

  • 我正在使用雙緩衝區的glfw,它已被報告在某些情況下出現問題。但是,使用glFlush()凍結了我的屏幕。 :/

  • 可能發生這種情況,glReadPixels方法在執行緩衝區交換時調用?我實際上使用互斥體來防止這種情況發生。

  • 在glfw中我需要一些技巧嗎?

下面是代碼以供參考:

glfwGetWindowSize(&mWidth, &mHeight); 

glBufferLock.lock(); 
std::cout << "\nSaving screenshot (" << mWidth << ", " << mHeight << ")\n"; 

int n=3 * mWidth * mHeight; 
GLubyte* pixels = new GLubyte[n]; 

glPixelStorei(GL_PACK_ALIGNMENT, 1); 


glReadPixels(0,0,mWidth,mHeight, GL_RGB, GL_UNSIGNED_BYTE, pixels); 
if (GL_NO_ERROR != glGetError()) throw "Error: Unable to read pixels."; 

// Convert to FreeImage format & save to file 
FIBITMAP* image = FreeImage_ConvertFromRawBits(pixels, mWidth, mHeight, 3 * mWidth, 24, 0xFF0000, 0x00FF00, 0x0000FF, false); 
FreeImage_Save(FIF_BMP, image, "test.bmp", 0); 

// Free resources 
FreeImage_Unload(image); 
delete [] pixels; 
glBufferLock.unlock(); 

非常感謝你對任何提示!

+0

Mutex?你不需要它,你有一個線程。請告訴我們這個截圖應該如何。什麼是原始圖像? – HolyBlackCat

+0

在[mcve]中編輯。 – genpfault

+0

你想截取一張圖片*你自己的*程序的渲染效果嗎,或者想把其他程序所畫的屏幕拍攝到外部窗口中嗎?如果後面的情況是這樣,不要試圖用OpenGL來做,因爲不可能(乾淨地)做。在Windows Vista之前,您可以通過利用Windows爲窗口分配幀緩衝區的方式來實現(在Windows平臺上)。但是這不再有效。 – datenwolf

回答

2

問題是我試圖從另一個線程抓取像素緩衝區。所有的openGL命令都必須從同一個線程執行。