3D渲染测试:看你的显卡怎么应付实时光线步进

这不是一个转动的方块。每个像素都朝3D体积射出一条光线,每一帧沿着光线步进最多一千次,每一步都要算一遍Mandelbulb公式。所以一个没有贴图、没有三角形的场景也能把显卡压垮,也因此它是着色器吞吐量的公平测试。

30秒。手机从低画质开始。

渲染是怎么做的

画布上大约一百万个像素,片元着色器为每一个像素从摄像机朝场景射出一条光线,沿着它小步前进。每一步都代入Mandelbulb距离公式问一句「我进到形状里了吗?」。答案翻转的那一刻,再用几次二分法把交点算准,然后着色。

画质档位决定每一步要把Mandelbulb公式迭代几次。低是2次,极高是12次。每多一次迭代,每条光线的每一步运算量都跟着翻倍,所以同样的像素数下,极高大约是低的六倍工作量。

着色用的是简单的反射模型,颜色取自到中心的距离,彩虹色的表面就是这么来的。整条管线没有任何贴图采样,整张图都是算出来的。

这个渲染压的是什么

片元着色器吞吐量

几乎所有工作都是像素着色器里的浮点运算:乘方、三角函数、开根号,每个像素几百次。游戏的光照和后期处理靠的就是这个单元。

循环和分支

光线碰到表面或离开体积就提前退出,所以相邻像素的工作量不一样。分支发散处理得好的显卡能保住FPS,处理不好的会停顿。

1024 × 1024的填充率

画布固定是约一百万像素的正方形,再缩放到适合你的窗口。这样手机和4K显示器的结果才能互相比较。

它不压的是什么

没有一个测试能覆盖整张显卡。这些部分在这里是闲着的。

显卡的哪一部分为什么闲着去哪里测
顶点和几何单元场景只有两个铺满屏幕的三角形,所有形状都来自像素着色器。多边形密集的游戏或3DMark
纹理单元和显存带宽没有采样任何贴图,除了着色器本身没有东西放在显存里。贴图或显存测试
视频解码没有播放视频。4K视频播放测试
温度和频率浏览器读不到传感器。HWiNFO、GPU-Z、MSI Afterburner

怎么解读数字

以中画质为准的大致预期。上限受屏幕刷新率限制。

如果你看到通常代表
平均值顶在刷新率上,最低值紧跟在后显卡还有余力。升一档找它的上限。
平均值明显低于上限,最低值接近平均值这张显卡在这个档位的稳定、诚实的成绩。
平均值不错,最低值低很多卡顿。有东西打断了测试:后台标签页、通知,或者降频刚开始。
独立显卡却只有个位数浏览器大概跑在核显上,或者硬件加速关了。

跑出干净结果的小技巧

  • 关掉其他在播视频或跑WebGL的标签页,它们共用显卡。
  • 测试中不要改窗口大小。画布会重新缩放,要花掉一帧。
  • 定时测试中不要拖动或缩放。30秒内摄像机是锁住的,这样每一次测试用的都是同一个视角。
  • 跑两次。有些驱动第一次会把着色器编译时间算进去。

3D渲染测试常见问题

关于这个渲染测试到底测什么的常见疑问。

1

这算真正的3D跑分吗?

它是真实的显卡负载,但很窄:测的是像素着色器吞吐量和分支处理,不是几何或显存。把它当成显卡性能的一个维度,不是游戏跑分的替代品。

2

为什么没有贴图?

这样结果只取决于显卡的运算单元。加了贴图会把显存带宽混进数字里,更难解读。

3

Mandelbulb是什么?

Mandelbrot集合的三维亲戚。它的表面由公式定义而不是网格,所以显卡必须为每条光线算出表面在哪里。这正是它适合当压力场景的原因。

4

为什么画布是正方形?

固定1024 × 1024的画布意味着每台设备渲染的像素数一样,手机和台式机在同一档位下才能比较。

5

显示器分辨率会影响成绩吗?

不会。画布永远是1024 × 1024,再缩放适配。屏幕刷新率倒是有影响:它限制了FPS的上限。

6

为什么转动视角FPS会变?

早早碰到表面的光线会早早停下。屏幕上空白区域多的视角要走更多步,跑得更慢。这就是定时测试要锁住摄像机的原因。