2014-10-29 137 views
0

天气纹理模型渲染速度比非纹理渲染速度快吗?我认为没有? 有什么区别,小或太高。带纹理和无纹理渲染时间?

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

+0

这不应该是一个技术问题,而是视觉设计之一 - 你是否希望你的游戏有一个老派的平淡色调的外观? – LearnCocos2D 2014-10-29 09:33:20

+0

@ LearnCocos2D,是的,我希望它是平的,我不想把大的细节,他们想知道会有助于提高性能。 – 2014-10-29 12:15:43

+0

在这种情况下,您不需要纹理,所以不要使用纹理,除非您想添加只能使用纹理添加的细节。这不是一个真正相关的性能决定,再加上即使非纹理模型速度较慢,应用程序也会使用大量内存,所以总是有一个折衷。 – LearnCocos2D 2014-10-29 14:45:58

回答

4

有没有合理的情况下纹理渲染会更快,它可能会更慢。这一切都取决于你的瓶颈在哪里。

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

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

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

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

+0

很好的答案。你可以添加“纹理坐标是否依赖(在着色器中计算)或不”到你的列表中。 – GuyRT 2014-10-30 09:36:27

2

除非你攻入GLSL然后从设备的角度来看它是相同的(至少对于现代设备)。

纹理渲染速度和非纹理渲染速度之间应该没有差异,必须有足够的纹理单元,gfx内存资源可用。如果不是那么纹理会杀死性能。当你使用更大的纹理时,会发生这种情况,然后你的gfx可以处理并且必须在共享的计算机内存和gfx卡之间进行交换。

可以影响性能的不是渲染本身,而是gl调用。例如,如果您使用像glTexCoord这样的旧内容,那么个人通话就会很慢。使用数组或VBO/VAO对象,如果你可以改为提高性能大大

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

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