我需要一些幫助,關於在Delphi XE2中將OpenGL的ViewPort的渲染內容保存爲位圖文件。OpenGL與德爾福:離線渲染圖像到文件
基本上,我想要做的事情是在完成一些渲染之後,將FrameBuffer的內容轉儲爲位圖(全綵色格式)文件。這是應該完成這個的代碼摘錄。
procedure TForm1.saveBtnClick(Sender: TObject);
var
//TBitmap object holding the newly created Bitmap.
srcBitmap: TBitmap;
// the array to hold pixels value while reading from the FrameBuffer
pixels: Array of GLUbyte;
dimensions: Array [0 .. 3] of Integer;
//Stream between the memory location of pixels and my bitmap.
MS: TMemoryStream;
I: Integer;
begin
if SaveDialog1.Execute then
begin
//create the bitmap and set it to Full Color Format; Open the Memory Stream
srcBitmap := TBitmap.Create;
srcBitmap.PixelFormat:=pf24bit;
MS:= TMemoryStream.Create;
//get the dimensions info for the current ViewPort
glGetIntegerv(GL_VIEWPORT, @dimensions);
srcBitmap.Width := dimensions[2];
srcBitmap.Height :=dimensions[3];
//allocate enough memory for pixels;
SetLength(pixels, dimensions[2] * dimensions[3] * 3);
//this is the function that is supposed to read the contents from the Frame
// Buffer and write them to pixels
glReadPixels(0, 0, dimensions[2], dimensions[3], GL_RGB,
GL_UNSIGNED_BYTE, @pixels);
//Do something if an error occured
ErrorHandler;
// Below I attempt to create a bitmap file from the read in pixels
MS.Read(pixels,dimensions[2] * dimensions[3] * 3) ;
srcBitmap.LoadFromStream(MS);
Edit2.Text := SaveDialog1.FileName;
srcBitmap.SaveToFile(Edit2.Text);
MS.Free;
srcBitmap.Free;
end;
end;
我遇到的主要問題是:
1)如果視口大小太大堆棧溢出錯誤(我得到這麼錯誤試圖保存的圖像大小爲256 * 256)。我認爲這可能是因爲'glReadPixels'函數將幀緩衝區讀取到PROCESSOR MEMORY(我假設這是L2 Cache),而不是主存儲器,並且這個不能適合整個圖像。是這樣嗎?如果是這樣,你有什麼想法,我怎麼讀FrameBuffer到主存儲器上?
2)爲了避免1)中的錯誤,在較小的視口(25x25)上進行測試時,給我一個訪問衝突錯誤,當我嘗試訪問存儲在「像素」數組中的任何值時。這意味着glReadPixels不能正確地從緩衝區中讀取數據,我相信其原因與我傳遞給函數glReadPixels(0, 0, dimensions[2], dimensions[3], GL_RGB,GL_UNSIGNED_BYTE, @pixels)
的參數之間有些不一致。
你是如何創建OpenGL上下文的?隱藏的窗口+ FBO或PBuffer? – datenwolf
那麼我做了默認的上下文初始化,使用 DC:= GetDC(panelHandle); RC:= CreateRenderingContext(DC,[opDoubleBuffered],32,24,0,0,0,0); ActivateRenderingContext(DC,RC) – kenny