【问题标题】:Overlaying graphics on top of OpenGL render context在 OpenGL 渲染上下文之上覆盖图形
【发布时间】:2014-10-06 17:51:12
【问题描述】:

我正在尝试在我的 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?

【问题讨论】:

    标签: delphi opengl user-interface bitmap graphics32


    【解决方案1】:

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

    OpenGL 不是场景图,它只是一个更复杂的绘图 API。您可以随时更改视口和变换参数,而无需更改到目前为止绘制的像素。所以很容易切换到屏幕空间坐标系并使用它来绘制叠加层。

    【讨论】:

    • 有趣。我试图映射四边形,以便 1 个位置单位等于屏幕上的 1 个像素。您究竟建议如何覆盖我的 GUI?你有一些参考文章什么的吗?
    • 通常您会选择一个坐标系,以便范围 [-1, 1] 覆盖整个视口。不要试图在 OpenGL 中思考像素,除了一些特殊情况,它没有意义,当你思考像素时,请准备好弯曲你的大脑,因为它不是微不足道的。像素中心不在整数坐标处,而是在视口中的 x+0.5 处,对于纹理,坐标 0 和 1 指的是边框像素的外边缘,即如果纹理处于环绕模式,则位于环绕纹理像素之间。
    • 好的。那时我很可能已经弯曲了我的大脑。这就是为什么我考虑在 OpenGL 渲染上下文之上叠加 2D 图形,但正如我在问题中所说:如何在不丢失 FPS 的情况下有效地做到这一点?
    • @AidVllasaliu:绘制场景后,将 glViewport 设置为覆盖图像的位置和大小,切换到带参数 (0,1,0,1,-1,1) 的正交投影并绘制一个四边形 (0,0),(1,0),(1,1),(0,1) 纹理坐标值相同,纹理是您的叠加层。使用 OpenGL 混合实现叠加效果。
    • 我在stackoverflow.com/questions/14908743/…看到了你对类似问题的回答
    猜你喜欢
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多