2011-05-15 172 views
1

我試圖一個OpenGL創建場景保存爲TBitmap。我遇到的問題是glReadPixels將返回所有空數據(全0)。爲什麼會發生這種想法?我試圖捕獲當前的OpenGL上下文。 (在屏幕上顯示的都是正常工作)。這是在Windows下的Delphi 7。保存OpenGL場景到TBitmap - glReadPixels返回空閒數據?

var 
    pbuf: pointer; 
    y: integer; 
    bmp: TBitmap; 
    p1, p2: pointer; 
begin 
    GetMem(pbuf, pnScene.Width * pnScene.Height * 4); 
    glReadPixels(0, 0, pnScene.Width, pnScene.Height, GL_RGBA, GL_UNSIGNED_BYTE, pbuf); 
    //<------ pbuf now contains all 0's ----------> 

    bmp := TBitmap.Create; 
    bmp.PixelFormat := pf32bit; 
    bmp.Width := pnScene.Width; 
    bmp.Height := pnScene.height; 

    for y := 0 to (pnScene.Height -1) do 
    begin 
     p1 := bmp.ScanLine[y]; 
     p2 := pointer(integer(pbuf)+ (y * bmp.Width * 4)); 
     CopyMemory(p1, p2, bmp.Width * 4); 
    end; 

    bmp.SaveToFile('c:\test\temp.bmp'); 
    bmp.Free; 
    FreeMem(pbuf); 
end; 

非常歡迎您的建議/想法!

附錄:

最終的計劃是放置glReadPixels()調用渲染要求錄製視頻的目的之後。當我這樣做的時候,它運作良好,所以這最終成爲一個沒有問題的東西。

+0

您是否檢查錯誤? glGetError – Bart 2011-05-15 08:26:31

+0

是的,對不起,我應該提到 - 沒有錯誤glReadPixels() – GrandmasterB 2011-05-15 17:33:21

回答

4

請確保您從創建GL上下文的同一線程執行此操作。如果這是你提供給第三方庫的回調函數,然後它可能沒有你甚至沒有意識到它在另一個線程中執行。這發生在我身上一次,我所得到的只有零和你一樣。

+0

這不是問題所在,但它確實導致我試圖將glReadPixels()嵌入到最終會反正出現的位置(我的上面的代碼只是一個測試函數) - 並且工作正常。 – GrandmasterB 2011-05-17 05:16:29

3

我假設你想取回已被交換到一個雙緩衝窗口的前緩衝器中的圖片。然後嘗試在glReadPixels(...)之前glReadPixels(...)

+0

我實際上已經嘗試過,但它似乎沒有區別。儘管我可以看到那些可能應該在那裏的東西,以防後來的代碼改變這個設置。 – GrandmasterB 2011-05-17 05:40:37

0

for循環必須更改聲明:

p1 := bmp.ScanLine[y]; 

p1 := bmp.ScanLine[OpenGlPanel.Height -1 -y]; 

否則,複製的位圖將是顛倒。