【问题标题】:Texture coordinates and optimizing GLSL shaders纹理坐标和优化 GLSL 着色器
【发布时间】: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 通常是瓶颈,但与每帧必须渲染的顶点数量相比,将数据重新复制到缓冲区的情况很少。


同样,我正在考虑取出我的模型变换矩阵并将其替换为 vec3vec2 分别用于平移和旋转(我只需要旋转 2 度),这会将我从 16 个浮点数击倒到5,然后我可以在顶点着色器中重建矩阵。同样,这会带走一些灵活性,而且我不确定是否会节省成本。

【问题讨论】:

  • 如果不坐下来对感兴趣的硬件进行剖析,就无法回答这个问题。这不是一个坏问题。只是问题会因实施而异,从硬件到硬件。在高端机器上,一种方法可能更快,但另一种方法在低端机器上可能更快。在 AMD 的 Fusion CPU/GPU 上,缓冲带宽可能比使用独立 GPU 时差得多。或者,离散 GPU 的 DMA 开销可能使 Fusion 芯片成为此方面的理想选择。如果不对其进行分析,就无法确定。

标签: opengl glsl textures shader


【解决方案1】:

我尝试以另一种方式进行,指定纹理矩形而不是字节索引,它实际上产生了巨大的速度提升(520 FPS 到 3600 FPS,或 1.92 毫秒/帧到 0.27 毫秒/帧)。

似乎减少计算更重要,至少在我的 GPU(Radeon HD 5700 系列)上是这样。或者也许只是模数很昂贵,不确定。不过,我对结果很满意;我以更低的成本获得更大的灵活性!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多