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

时间:2010-07-22 17:03:16

标签: c++ opengl winapi

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

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

然后对于每个帧我只绘制两个OpenGL四边形,并使用相应的图像纹理。 然后将DIB内容保存到文件中。

例如,一个效果是将两个四边形(在3d空间中)定位为两个广告牌,一个在另一个前面(遮挡它),然后向上,向前和向下俯冲相机,这样你就可以看到第二个

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

我尝试将每个图像四边形渲染为数百个单独的图块,但它只需要相同的时间,看起来它取决于可见纹理像素的数量。

我认为OpenGL可以在一秒钟内完成数以万计的多边形。我在这里缺少什么吗?

使用其他方法会更好吗?

提前致谢...

编辑:

GL字符串显示为DIB版本:

供应商:Microsoft Corporation 版本:1.1.0 渲染器:GDI Generic

屏幕版本显示: 供应商:ATI Technologies Inc. 版本:3.2.9756兼容性配置文件上下文 渲染器:ATI Mobility Radeon HD 3400系列

所以我想我将不得不使用FBO,我对如何将渲染数据从FBO输出到DIB,任何指针(双关语)都有点困惑?

2 个答案:

答案 0 :(得分:5)

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

但请记住,图形硬件主要面向在屏幕上绘图。捕获渲染数据通常会比显示数据更慢,即使你让硬件进行渲染 - 尽管它仍然比软件渲染快得多。

编辑:DominikGöddeke有一个tutorial,其中包含用于将纹理数据读回CPU地址空间的代码。

答案 1 :(得分:2)

你的问题有一个问题:
您没有提供实际的渲染/纹理生成代码。

  

使用其他方法会更好吗?

您可以做的最简单的事情是确保纹理的大小等于2的幂。即而不是1024x768使用1024x1024,并仅使用该纹理的一部分。说明:虽然大多数现代硬件都支持非pow2纹理,但它们有时被视为“特殊情况”,使用这种纹理可能会在某些硬件上产生性能下降。

  

我认为OpenGL可以在一秒钟内完成数以万计的多边形。我在这里缺少什么吗?

是的,你错过了一件重要的事情。很少有东西限制GPU性能:
1.系统内存到视频内存传输速率(可能不是你的情况 - 仅当数据每帧改变时动态纹理\几何) 2.计算成本。 (如果您使用大量计算编写着色器,则会很慢。) 3.填充率(程序每秒可以放在屏幕上的像素数),AFAIK取决于现代GPU上的内存速度。
4.顶点处理速率(不是你的情况) - GPU每秒可以处理多少个顶点 5.现代GPU上的纹理读取速率(GPU可读取的每秒纹理数量)取决于GPU内存速度 6.纹理读取缓存(不是你的情况) - 即在片段着色器中,你可以在每个像素上读取几百次纹理,几乎没有性能下降IF坐标彼此非常接近(即每次读取几乎相同的纹素) - 因为结果是缓存的。但是,如果您尝试为每个像素访问100个随机定位的纹素,性能将显着下降。

所有这些特性都取决于硬件。

即,根据某些硬件,您可以每帧渲染1500000个多边形(如果它们占用少量屏幕空间),但如果每个多边形填满整个屏幕,您可以将fps带到100个多边形的膝盖上,使用alpha - 混合和纹理与高度详细的纹理。

如果您考虑一下,您可能会注意到有很多可以绘制风景的视频卡,但是当您进行帧缓冲效果(如模糊,HDR等)时,fps会下降。

此外,如果您有内置GPU,则可能会因纹理曲面而降低性能。当我在以前的主板上炸掉PCIEE插槽时,我不得不使用内置GPU(NVidia 6800或其他东西)。结果不愉快。虽然GPU支持着色器模型3.0并且可以使用相对计算上昂贵的着色器,但每当屏幕上出现纹理对象时,fps会迅速下降。显然是因为内置GPU使用部分系统内存作为视频内存,而“正常”GPU内存和系统内存的传输速率不同。