我正在尝试将图形覆盖在我的 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/