纹理坐标和优化GLSL着色器

时间:2012-02-14 02:17:16

标签: opengl glsl textures shader

我正在讨论以各种方式将纹理坐标传递给GLSL着色器的优缺点。

我正在渲染大量的实例数据。我有一个基本模型,然后我将转换矩阵和纹理/精灵索引传递给我的着色器。然后根据变换矩阵旋转和平移每个模型,并根据此片段确定纹理:

TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y+(TexIndex/16))/16;

我不喜欢的是我对精灵和纹理大小进行了硬编码。我可以使用制服来传递这些信息,但是我仍然有限制,我的精灵不能在不同实例之间变化(不是我有一个计划的用例)。此外,在GPU上进行更多计算以确定精灵的坐标。

我可以使用的另一种方法是指定一个整个Rect,它可以在纹理贴图中划分精灵的位置,宽度和高度。但是,这需要指定4个浮点数(16个字节)的信息,而不是单个纹理索引字节。比如200K实例,我们正在查看大约3 MB的数据(除了其他数据)。我不知道在今天这个时代是否被认为是“很多”。

我应该专注于简化GLSL着色器中的计算还是最小化缓冲区的大小?我听说将数据传输到GPU通常是瓶颈,但是将数据重新复制到缓冲区将很少与每帧渲染的顶点数量进行比较。


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

1 个答案:

答案 0 :(得分:0)

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

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