纹理和非纹理渲染时间?

时间:2014-10-29 07:04:12

标签: opengl graphics 3d unity3d opengl-es-2.0

天气纹理模型渲染速度比非纹理模型更快?我认为不是吗? 可能有什么不同,小或太高。

我正在为支持OpenGL的设备创建游戏。我想减少绘制调用和渲染时间。我是否更喜欢非纹理的彩色模型?

2 个答案:

答案 0 :(得分:4)

在没有合理的情况下,纹理渲染会更快,而且可能会更慢。这完全取决于你的瓶颈所在。

从根本上说,当您使用纹理时,您的(片段)着色器中会进行纹理采样操作。这些操作通常由具有有限吞吐量的专用硬件单元执行。同样重要的是,他们显然必须访问纹理数据,这很容易成为瓶颈,取决于许多因素:

  • 如果您的片段处理首先是瓶颈。虽然这很常见,但图形应用程序也可能受CPU限制,或受到图形管道其他部分的限制。
  • 片段着色器的整体复杂性。如果还有很多其他耗时的操作,纹理采样操作将会产生相对差异。
  • 纹理采样与其他着色器操作的重叠程度。
  • 纹理访问的位置。纹理采样使用缓存,缓存效率取决于访问模式,其中本地化访问通常优于分散访问。
  • 纹理的大小。
  • 如果使用mipmapping。
  • 硬件性能特征。

但一般来说,如果不需要纹理,你就不应该使用纹理。特别是如果着色器很简单,纹理很大,采样的内存带宽很容易成为渲染管道的瓶颈。

事情变得更有趣的是,如果在着色器中使用纹理和更多计算之间存在权衡。例如,对于某些相对复杂的照明方法,您可以选择使用存储在纹理中的预计算结果,或者每次都在着色器中执行完整计算。这些案件需要进行基准测试。现代GPU具有大量的原始马力,执行更多操作可能比纹理访问更有效。

答案 1 :(得分:2)

除非您正在使用 GLSL ,否则从设备的角度来看它是相同的(至少对于现代设备而言)。

粗糙的纹理和无纹理渲染速度之间应该没有区别,必须有足够的纹理单元,gfx可用的内存资源。如果没有,那么纹理会破坏性能。当您使用更大的纹理然后您的gfx可以处理并且必须在共享计算机内存和gfx卡之间交换时会发生这种情况。

影响性能的不是渲染本身,而是gl调用。例如,如果你使用像glTexCoord这样的旧东西,那么单个调用就是那么慢。如果可以的话,可以使用数组或 VBO / VAO 对象来提高性能极大

一个常见的初学者错误是在每次使用之前将纹理加载到gfx中而不是将其留在卡片中。我播种了很多次......甚至在我初学的时候我也是这样做的。要激活纹理,只需使用glBind(...)调用,如果需要,可以设置纹理单元的几个参数,但只需 ONCE 将纹理加载到内存中。

渲染尝试尽可能少地切换纹理时,重要的是,如果可能的话,使用相同的纹理对所有几何进行渲染/分组。为此目的编写了一些 3D 网格文件格式,通常对于整个对象存在单个纹理,因此不需要不必要的纹理上下文切换。这也是为什么纹理地图集更快,回收质量更低的原因。在现代的 OpenGL 中,现在还有无绑定纹理,它可以消除glBind调用以获得额外内存的纹理id参数。