gpt4 book ai didi

delphi - OpenGL与Delphi : Offscreen Rendering of an Image to File

转载 作者:行者123 更新时间:2023-12-03 15:56:52 25 4
gpt4 key购买 nike

我需要一些有关在 Delphi XE2 中将 OpenGL ViewPort 的渲染内容保存到位图文件的帮助。

基本上,我想要做的事情是在完成一些渲染后,将 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) 如果 ViewPort 大小太大,则会出现堆栈溢出错误(尝试保存大小为 256*256 的图像时出现错误)。我认为这可能是因为“glReadPixels”函数将 FrameBuffer 读取到处理器内存上(我假设这是 L2 Cache),而不是主内存,并且这个内存无法容纳整个图像。是这样吗?如果是这样,您知道如何将帧缓冲区读取到主内存上吗?

2) 在较小的视口(viewport) (25x25) 上进行测试,以避免 1) 中的错误,当我尝试访问存储在“像素”数组中的任何值时,会出现访问冲突错误。这意味着 glReadPixels 无法正确从缓冲区读取,我相信其原因是我传递给函数的参数之间存在一些不一致 glReadPixels(0, 0,dimensions[2],dimensions[ 3]、GL_RGB、GL_UNSIGNED_BYTE、@pixels)

最佳答案

Procedure GetOGL_BMP(var BMP: TBitmap);
var
Dimensions: array [0 .. 3] of Integer;
RGBBits: PRGBQuad;
Pixel: PRGBQuad;
Header: PBitmapInfo;
x, y: Integer;
Temp: Byte;
begin
glGetIntegerv(GL_VIEWPORT, @Dimensions);
GetMem(RGBBits, Dimensions[2] * Dimensions[3] * 4);
glFinish;
glPixelStorei(GL_PACK_ALIGNMENT, 4);
glPixelStorei(GL_PACK_ROW_LENGTH, 0);
glPixelStorei(GL_PACK_SKIP_ROWS, 0);
glPixelStorei(GL_PACK_SKIP_PIXELS, 0);
glReadPixels(0, 0, Dimensions[2], Dimensions[3], GL_RGBA, GL_UNSIGNED_BYTE,
RGBBits);
if not Assigned(BMP) then
BMP := TBitmap.Create;
BMP.PixelFormat := pf32Bit;
BMP.Width := Dimensions[2];
BMP.Height := Dimensions[3];
GetMem(Header, SizeOf(TBitmapInfoHeader));
with Header^.bmiHeader do
begin
biSize := SizeOf(TBitmapInfoHeader);
biWidth := Dimensions[2];
biHeight := Dimensions[3];
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := Dimensions[2] * Dimensions[3] * 4;
end;
// Rot und Blau vertauschen
Pixel := RGBBits;
for x := 0 to Dimensions[2] - 1 do
for y := 0 to Dimensions[3] - 1 do
begin
Temp := Pixel.rgbRed;
Pixel.rgbRed := Pixel.rgbBlue;
Pixel.rgbBlue := Temp;
inc(Pixel);
end;
SetDIBits(BMP.Canvas.Handle, BMP.Handle, 0, Dimensions[3], RGBBits,
TBitmapInfo(Header^), DIB_RGB_COLORS);

FreeMem(Header);
FreeMem(RGBBits);
end;

关于delphi - OpenGL与Delphi : Offscreen Rendering of an Image to File,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14343873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com