性能取决于索引类型

Perfomance depending on index type

我正在尝试“绘制”数百万个三角形并发现了一些有趣的东西:将索引类型从 VK_INDEX_TYPE_UINT32 切换到 VK_INDEX_TYPE_UINT16 每秒绘制的三角形数量增加了 1.5 倍!我想知道,速度怎么相差这么大?

我使用间接索引实例化(这么多我)绘图:25个顶点,138个索引(46个三角形),2^21~=2M个实例(我懒得找哪里禁用vSync),每个绘图1次框架。每帧总共 96'468'992 个三角形。为了获得最清晰的结果,我将目光从三角形移开(丢弃光栅化具有几乎相同的性能)

我有非常简单的顶点着色器:

layout(set = 0, binding = 0) uniform A
{
    mat4 cam;
};

layout(location = 0)in vec3 inPosition;//
layout(location = 1)in vec4 inColor;   //Color and position are de-interleaved
layout(location = 2)in vec3 inGlob;    //
layout(location = 3)in vec4 inQuat;    //data per instance, interleaved

layout(location = 0)out vec4 fragColor;

vec3 vecXquat(const vec3 v, const vec4 q)
{// function rotating vector by quaternion
    return v + 2.0f *
           cross(q.xyz,
           cross(q.xyz, v)
                + q.w * v);
}

void main(){
    gl_Position = vec4(vecXquat(inPosition, inQuat)+inGlob, 1.0f)*cam;
    fragColor = inColor;
}

和直通片段着色器。

基元 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST

结果:

~1950MTris/s 32 位索引

~2850MTris/s 16 位索引

GPU - GTX1050Ti

由于您的着色器非常简单,因此您的渲染性能可能会受到一些其他因素的影响,例如顶点数据传输率。

GPU 必须为每个实例读取 138 个索引。如果有 200 万个实例,那么只有 1.02GB 的索引数据必须由具有 32 位索引的 GPU 读取。当然,对于 16 位索引,传输速率减半。使用一半的数据,索引数据更有可能完全适合顶点拉取缓存。