- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要一些有关在 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/
我需要在每个渲染帧完成后拍摄屏幕截图,但我发现某些屏幕截图是重复的,所以我想知道是否可以在渲染完成之前保存屏幕截图。因此... renderer.render() 会阻塞直到完成渲染吗? 如果没有,有
web.py 骨架代码中的“render._keywords['globals']['render'] = render”是什么意思? http://webpy.org/skeleton/0.3 最佳
所以在我的 Nuxt universal-mode 应用程序中,我有时会出现错误: vue.runtime.esm.js:620 [Vue warn]: The client-side rendere
我想创建一个 portal-like effect使用 Bevy . Unity 似乎有一个 render texture实现这一目标。 有没有办法在 Bevy 中做同样的事情?如果没有, futur
我有一个看起来像这样的组件(非常简化的版本): const component = (props: PropTypes) => { const [allResultsVisible, setA
编辑:我调整了代码,但问题仍然存在。见下文 我有这个 p:selectOneRadio : 而这个 p:radioButton : 和 AData包含其
为了渲染部分我可以使用 render 'partial_name' 或 render partial: 'partial_name' 我开始知道 render 是 render partial 的简写
我注意到文章中的一些地方使用了 React.render() 和一些地方 ReactDOM.render()。这两者有什么具体区别吗? 最佳答案 这是 0.14 中引入的最新更改。他们将 React
我的代码是这样的: function render() { renderer.render( scene, camera ); renderer.clear(); } 我想知道为什么它
我目前正在实现 useSWR 以便从我的 express 和 mongo-db 后端获取数据。我能够从数据库中成功获取数据没问题。以下是我用来实现此目的的代码: ```//SWR method for
我只有在按照 React native - "this.setState is not a function" trying to animate background color? 的建议合并了 u
所以我有一个大的纹理,被分成 64x64 block 。 我使用将其加载到 LibGDX texture = new Texture("texturemap.png"); regions = Text
我对放置 @Scripts.Render 和 @Styles.Render 的位置感到很困惑。理想情况下,我会将它们全部放在 head 部分中,但出乎意料的是,例如 @Scripts.Render("
我正在尝试使用 jamon 来收集使用 Tapestry 的网站的统计信息(呈现网页的时间)。 我怎样才能拥有 服务器收到请求时执行的方法,即渲染开始时? 响应全部发送完毕,即渲染结束时执行的方法 ?
在我的 React 应用程序中,我想要渲染一个 prop 值,但直到渲染完成后更新 props 后它才存在。 this.props.users 是一个对象,因此我使用 Object.keys() 转换
我正在使用 React 的钩子(Hook),我希望有一个从数据库中检索到的值作为初始值。但是,我收到以下错误: Invariant Violation: Invariant Violation: Re
我正在尝试按照以下代码将多个场景包含到单个 webgl 渲染器中: renderer.render(scene1, camera); renderer.render(scene2, camera);
我在我的 xhtml 页面中使用此代码,当我运行应用程序时,元描述仍在呈现。我想根据某些条件使用元描述标签。主布局: ..........
我正在使用react-native-render-html来渲染html。renderers方法允许我提供自定义函数来呈现特定标签。不过,我想使用源代码中的原始内部 HTML 将子组件替换为我的自定义
我有一个网格,可以渲染可变高度的卡片。 为了获取卡片的高度,我将卡片渲染在 ReactHeight 中。 ( https://github.com/nkbt/react-height ),这让我可以在
我是一名优秀的程序员,十分优秀!