我正在开发一个支持未来3D的2D游戏引擎。在当前的开发阶段,我正在研究批次渲染器。大家可能知道,当将图形进行批量处理时,对于颜色(RGBA)、纹理坐标、纹理 ID(纹理索引)和模型变换矩阵的统一支持被忽略,而是通过顶点缓冲区传递。现在,我已经实现了将模型的位置、颜色、纹理坐标和纹理 ID 传递到顶点缓冲区。我的顶点缓冲区格式如下:
float* v0 = {x, y, r, g, b, a, u, v, textureID};
float* v1 = {x, y, r, g, b, a, u, v, textureID};
float* v2 = {x, y, r, g, b, a, u, v, textureID};
float* v3 = {x, y, r, g, b, a, u, v, textureID};
我即将整合一个使用变换矩阵计算物体在世界空间中应该出现的位置的功能。这引发了我的一个问题:
变换矩阵应该在CPU还是GPU上与模型顶点位置相乘?
需要记住的一点是,如果我将其传递给顶点缓冲区,我每个顶点都必须上传一次变换矩阵(每个精灵4次),这对我来说似乎是浪费内存。另一方面,通过在CPU上将模型顶点位置乘以变换矩阵似乎会比GPU并发能力慢。
如果我在GPU上计算变换,我的顶点缓冲区格式将如下所示:
float* v0 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v1 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v2 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
float* v3 = {x, y, r, g, b, a, u, v, textureID, m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11, m12, m13, m14, m15};
问题主要是理论驱动的。因此,一个理论和技术方面的答案将会更受欢迎。但是,为了参考,在这里是代码。