【问题标题】:Fewer vertices vs. fewer fragmens更少的顶点与更少的片段
【发布时间】:2017-02-08 23:35:12
【问题描述】:

目前我正在实现一个字符串渲染算法,该算法基本上从纹理图集中采样纹素,四边形作为基础几何体。我必须在两种方法之间进行选择:

  • 将字符串的每个字形呈现为单独的四边形。每个顶点都有一个位置和字体图集纹理坐标。片段着色器对图集进行采样,否则很简单。

  • 将整个字符串渲染为一个四边形。顶点格式必须通过一点簿记信息(2 个浮点数)来扩展,并且片段着色器会获得一些额外的乘法。有大约 ca 的片段开销。 10%。

哪个可能更高效?

【问题讨论】:

  • 为什么不尝试对两者进行基准测试呢?我能想到的是,第二种方法可能会失去一些性能,因为四边形不能并行绘制。
  • 我的假设是 a) 发送到 gpu 的顶点数据量(必须每帧完成)较低(尽管我不知道这是否适用于 gles 和共享内存架构) 和 b) 片段仍然可以并行处理,对吧?
  • 使用第二个选项,如何在片段着色器中查找正确的纹素?如果它引入了依赖纹理读取,那么这可能会在许多较旧的 OpenGLES 设备上造成很大的性能损失。根据经验,减少片段着色器工作通常是可行的方法,但测量是唯一确定的方法。
  • 它在现有纹理的基础上增加了一种纹理读取。该设备支持 gles 3.1。
  • 顺便说一句,使用带有分支的采样器数组会引入依赖纹理读取吗?这意味着,我使用 if-else 子句从几个采样器中选择一个来采样?

标签: c++ opengl-es


【解决方案1】:

对于大多数图形内容,屏幕上的文本相对较少,因此除非您每帧渲染数千个字符字形,否则我不会太担心。

您需要做的一件事是将字形渲染批处理为 CPU 端的少量 glDraw*() 调用;我已经看到很多内容每次绘制一个字形,这非常昂贵 - 不要那样做!

【讨论】:

  • 我已经在一次绘制调用中拥有了所有内容。我从用一万个字形渲染数百个字符串的角度来看。
  • 我怀疑唯一明智的答案是在您关心的平台上“对其进行基准测试”。 10 个 K 字形,就是 40 个 K 顶点,这将开始成为一些低端移动平台上性能的重要组成部分。
猜你喜欢
  • 2018-02-08
  • 1970-01-01
  • 2015-09-05
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
相关资源
最近更新 更多