是否可以使用GLES2 GLSL片段着色器的非标准化纹理坐标?

我想从我的GLES2 GLSL 片段着色器使用非标准化的纹理坐标(0-w,0-h而不是GLES2查找纹理GLES2 。 原因是这个纹理被用作查找表,我得到了标准化坐标的精度 问题

我发现GL_TEXTURE_RECTANGLE不支持扩展名,也不支持texelFetch() ,所以我排除了这些选项。

谢谢!

我不确定你的意思是未标准化的纹理坐标。 所有的纹理查找将在0-1的范围内。 然而,你可以让他们在这个范围内的任何地方。 如果您在0-1的范围内遇到精度问题,我怀疑还有其他事情正在进行。

有几个提示可以帮助解决这个问题:

例如,确保你没有为你的纹理设置GL_LINEAR 。 为了查找是准确的,你可能会想要GL_NEAREST 。 否则,它可以平均textel周围的数据,并给你一个插值的结果。 GL_WRAP设置也一样。 你可能想要这样的东西:

  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

我曾经有一个大的纹理地图集(2048×2048),上面有一堆精灵。 在纹理的一个小区域,我有一个查找表。 所以在这种情况下,查找S开始于1024/2048,结束于1536/2048。 所以我转到了SStartSWidth的着色器制服。 和TStartTWidthSStart0.5SWidth0.25 。 在我的S方向上,我有512个步骤,或2048 0.25 。 在T方向上,它也是一个小部分,但是我也需要确保它不会stream到旁边的一个。 所以我做了大约8个像素的纹理的每个查找,并在代码中我打算中间。

S方向的math是0-1的input,所以公式是s = SStart + input * SWidth

lowpvariables有足够的精度处理0-1范围内的查找,以适应硬件支持的任何纹理大小。 甚至1/4096 。 这就是gxf卡的devise目的。