2014-10-06 43 views
4

我想要在我的OpenGL渲染场景上叠加图形。在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的“位图”属性。换句话说:GLScene渲染上下文正在渲染,但我自己的图形没有渲染。 代码:

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

我怎样才能在渲染上下文的顶部适当覆盖图形,或复制渲染上下文输出,不失FPS?

回答

8

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

OpenGL不是场景图,它只是一个稍微复杂的绘图API。您可以随时更改视口和变换参数,而不会改变迄今为止绘制的像素。因此,切换到屏幕空间坐标系并使用该坐标系绘制覆盖图很容易。

+0

有趣。我试图将四边形映射成1个单位的位置等于屏幕上的1个像素。你如何建议覆盖我的GUI?你有一些参考文章或什么? – xaid 2014-10-06 19:31:05

+0

通常你会选择一个坐标系,使得范围[-1,1]覆盖整个视口。不要试图在OpenGL中思考像素,除了一些特殊情况下它没有意义,并且当你以像素为单位考虑时,准备弯曲你的大脑,因为它不是微不足道的。像素中心不是整数坐标,而是在视口中的x + 0.5处,对于纹理,坐标0和1指的是边界像素的外边缘,即纹理是否处于包裹模式中,正好在包裹纹理像素之间。 – datenwolf 2014-10-07 00:01:28

+0

好的。那么我最有可能把我的脑子弯曲得足够大。这就是为什么我想在OpenGL渲染上下文中叠加2D图形的原因,但正如我在我的问题中所说的:如何在不丢失FPS的情况下高效地执行该操作? – xaid 2014-10-07 13:40:49