【问题标题】:Textured and Non-Textured Rendering Time?纹理和非纹理渲染时间?
【发布时间】:2014-10-29 07:04:12
【问题描述】:

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

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

【问题讨论】:

  • 这不应该是技术问题,而是视觉设计问题 - 您是否希望您的游戏具有老式的纯色外观?
  • @LearnCocos2D,是的,我希望它是扁平的,我不想放太多细节,他们想知道这是否有助于提高性能。
  • 在这种情况下你不需要纹理,所以不要使用它们,除非你想添加只能通过使用纹理添加的细节。这并不是一个真正相关的性能决定,而且即使非纹理模型速度较慢,应用程序也会使用大量内存,因此总是需要权衡取舍。

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


【解决方案1】:

没有任何合理的场景纹理渲染会更快,而且很可能会更慢。这完全取决于您的瓶颈在哪里。

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

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

但一般来说,如果没有必要使用纹理,则不应使用它。特别是在着色器简单且纹理较大的情况下,来自采样的内存带宽很容易成为渲染管线的瓶颈。

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

【讨论】:

  • 好答案。您可以将“纹理坐标是否依赖(在着色器中计算)”添加到您的列表中。
【解决方案2】:

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

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

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

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

渲染时重要的是尽可能少地切换纹理,因此尽可能使用相同的纹理渲染/组合所有几何图形。为此目的编写了一些 3D 网格文件格式,通常整个对象只有一个纹理,因此不需要不必要的纹理上下文切换。这也是为什么纹理图集在质量较低的情况下更快的原因。在现代 OpenGL 中,现在还有无绑定纹理,它摆脱了 glBind 调用,以增加纹理 id 参数的内存为代价。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多