【发布时间】:2012-03-05 11:07:26
【问题描述】:
我正在讨论以各种方式将纹理坐标传递给 GLSL 着色器的利弊。
我正在渲染大量实例数据。我有一个基本模型,然后我将一个变换矩阵和一个纹理/精灵索引传递给我的着色器。然后根据变换矩阵对每个模型进行旋转和平移,并根据此 sn-p 决定纹理:
TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y+(TexIndex/16))/16;
我不喜欢的是我硬编码了精灵和纹理大小。我可以使用制服来传递这些信息,但是我仍然有一个限制,即我的精灵不能因实例而异(不是我有计划的用例)。此外,在 GPU 上需要更多的计算来确定精灵的坐标。
我可以使用的另一种方法是指定一个完整的 Rect,它将在纹理贴图中界定精灵的位置、宽度和高度。但是,这需要指定 4 个浮点数(16 个字节)的信息,而不是单个纹理索引字节。将其乘以 200K 实例,我们正在查看大约 3 MB 的数据(除了其他数据)。我不知道这在当今时代是否被认为是“很多”。
我应该专注于简化 GLSL 着色器中的计算还是最小化缓冲区的大小?我听说将数据传输到 GPU 通常是瓶颈,但与每帧必须渲染的顶点数量相比,将数据重新复制到缓冲区的情况很少。
同样,我正在考虑取出我的模型变换矩阵并将其替换为 vec3 和 vec2 分别用于平移和旋转(我只需要旋转 2 度),这会将我从 16 个浮点数击倒到5,然后我可以在顶点着色器中重建矩阵。同样,这会带走一些灵活性,而且我不确定是否会节省成本。
【问题讨论】:
-
如果不坐下来对感兴趣的硬件进行剖析,就无法回答这个问题。这不是一个坏问题。只是问题会因实施而异,从硬件到硬件。在高端机器上,一种方法可能更快,但另一种方法在低端机器上可能更快。在 AMD 的 Fusion CPU/GPU 上,缓冲带宽可能比使用独立 GPU 时差得多。或者,离散 GPU 的 DMA 开销可能使 Fusion 芯片成为此方面的理想选择。如果不对其进行分析,就无法确定。
标签: opengl glsl textures shader