delphi - 在 OpenGL 渲染上下文之上叠加图形

标签 delphi opengl user-interface bitmap graphics32

我正在尝试将图形覆盖在我的 OpenGL 渲染场景之上。

我已经设法让它启动并运行,但 FPS 的下降有点太多了。

我目前正在将 GLScene 与 Graphics32 结合使用。

我所做的是将 GLScene 渲染上下文渲染为位图, 将该位图应用于 TImageView32,并在 TImage32 内进行一些最终的 UI 修改。

我用来渲染位图的代码如下,这也会降低 FPS:

procedure RenderToBitmap;
  var b: TBitmap;
begin
  b:=TBitmap.Create;
  b:=GLSceneViewer.Buffer.CreateSnapShotBitmap; //TGLSceneViewer
  ImgVwr32.Bitmap.Assign(b); //TImageViewer32
  b.Free;
end;

我尝试了一些其他代码(见下文),它给了我实时渲染,但我不能 修改ImageViewer32的“Bitmap”属性。换句话说:GLScene 渲染上下文正在渲染,但我自己的图形没有渲染。 代码:

//The following line is put inside the FormCreate call
GLSceneViewer.Buffer.CreateRC(GetDC(ImgVwr32.Handle),false);

如何在不丢失 FPS 的情况下正确地将图形覆盖在渲染上下文之上,或复制渲染上下文输出?

最佳答案

好吧,通过避免整个 GPU→CPU→GPU 复制往返。将叠加层上传到 OpenGL 纹理中,并使用大型纹理四边​​形将其绘制在整个场景上。

OpenGL 不是场景图,它只是一个更复杂的绘图 API。您可以随时更改视口(viewport)和变换参数,而无需更改目前绘制的像素。因此,只需切换到屏幕空间坐标系并使用它绘制覆盖层就很容易了。

关于delphi - 在 OpenGL 渲染上下文之上叠加图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26221895/

相关文章:

delphi - 将对象列表保存在文本文件中

c++ - 将深度渲染缓冲区复制到深度缓冲区

opengl - 从一个纹理读取并写入同一帧缓冲区中的单独纹理

c++ - 在工作线程创建新 GUI 元素的地方使用 Qt

Delphi - 更改任务栏图标

delphi - 如何知道节点是 Virtual TreeView 中的根节点?

Delphi 动态创建弹出菜单项 - 无效指针操作/访问冲突

c++ - 在 visual studio 2010 和 c++ 中使用 OpenGL 绘制带有箭头的轴

user-interface - MATLAB GUI 外观和感觉

user-interface - 用于实验 OpenCV 的 GUI 发生了什么变化?