代码之家  ›  专栏  ›  技术社区  ›  rep_movsd

如何在Win32上使用大纹理加速屏幕外OpenGL渲染?

  •  1
  • rep_movsd  · 技术社区  · 14 年前

    我正在开发一些C++代码,可以在两个图像之间做一些想象的3D转换效果,我认为OpenGL是最好的选择。

    我从一个DIB部分开始,为OpenGL设置它,然后从输入图像创建两个纹理。

    然后对于每一帧,我只画两个OpenGL四边形,以及相应的图像纹理。

    例如,一种效果是将两个四边形(在三维空间中)像两个广告牌一样定位,一个在另一个的前面(使其模糊),然后上、前、下猛扑相机,以便可以看到第二个。

    我的输入图像是1024x768左右,当四边形覆盖大部分视图时,渲染需要很长时间(100毫秒)。如果相机离得远,它会加速。

    我以为OpenGL一秒钟就可以处理无数个多边形。有什么我不知道的吗?

    我还是用别的方法好吗?

    编辑:

    渲染器:GDI通用

    供应商:ATI Technologies Inc。 版本:3.2.9756兼容性配置文件上下文

    所以我想我将不得不使用FBO的,我有点困惑,如何获得渲染数据从FBO到DIB,有任何指针(双关语意图)在这?

    2 回复  |  直到 14 年前
        1
  •  5
  •   Jerry Coffin    14 年前

    这听起来像是渲染到DIB是强迫渲染在软件中发生。我将渲染到帧缓冲区对象,然后从生成的纹理中提取数据。Gamedev.net有一个相当不错的 tutorial .

    但是,请记住,图形硬件主要面向在屏幕上绘图。捕获渲染数据通常比显示数据要慢,即使您确实使用了硬件来执行渲染,但它仍然应该比软件渲染快很多。

    编辑:多米尼克·格德克 tutorial 这包括将纹理数据读回CPU地址空间的代码。

        2
  •  2
  •   SigTerm    14 年前

    你的问题有一个问题:

    我还是用别的方法好吗?

    我以为OpenGL一秒钟就可以处理无数个多边形。有什么我不知道的吗?


    1.系统内存到视频内存的传输速率(可能不是您的情况-仅适用于每帧数据更改时的动态纹理\几何体)。
    2.计算成本(如果编写计算量大的着色器,则速度会很慢)。
    3.填充率(程序每秒可以在屏幕上放置多少像素),AFAIK取决于现代gpu上的内存速度。

    5.在现代GPU上,纹理读取速率(GPU每秒可以读取多少texel)取决于GPU的内存速度。

    所有这些特性都依赖于硬件。

    也就是说,根据某些硬件的不同,您可以渲染每帧1500000个多边形(如果它们占用少量的屏幕空间),但如果每个多边形填充整个屏幕,使用alpha混合并使用高度详细的纹理进行纹理处理,则您可以使用100个多边形将fps渲染到膝盖。

    此外,如果你有内置的GPU,你可能会得到性能下降与纹理表面。当我在以前的主板上炸PCIEE插槽时,我不得不使用内置的GPU(nvidia6800之类的)。结果并不令人愉快。虽然GPU支持shader model 3.0,并且可以使用相对昂贵的着色器,但每次屏幕上有纹理对象时,fps都会迅速下降。显然,这是因为内置GPU使用了部分系统内存作为视频内存,而“普通”GPU内存和系统内存的传输速率不同。