在着色器中将 int 乘以 65536 不会在较旧的 ES 2 设备上编译



当我执行时

int temp2 = temp1 * 65536;

在我的旧Xperia J智能手机(大约8年左右(上的顶点着色器中,我收到着色器编译错误 - 不幸的是,API没有显示错误的原因。

但是当我在现代智能手机上运行相同的代码时,我没有收到编译错误。

旧手机上的解决方法是使用

int temp2 = temp1 * int(65536.0);

相反。

我正在使用precision highp float;并且我已经尝试过precision highp int;但这并没有解决问题。

关于为什么会这样的任何信息?也许这只是早期 GLSL 实现中的一个错误?

我已经考虑但尚未尝试的另一种解决方法是仅将65536作为整数uniform上传。

我想我会在评论中发布我的发现作为答案,因为我在旧的 GLSL 编译器中发现了另一个"错误"。

首先是我的OP...似乎较旧的GLSL编译器可以错误地读取文字值,我通过将它们作为uniform发送来修复

我发现的第二个奇怪的行为涉及以下代码,它来自处理作为纹理发送的精灵数据的顶点着色器。除v_Color信息外,所有数据均已正确读取。但是,如果将标有 (*( 的行移动到显示的代码的最末尾,则颜色信息会正确到达。如果您将v_Color行向上移动并相应地更改offset订单,它也会正确到达。我想这一定也是一个旧的 GLSL 着色器编译器错误。

spriteId = int(a_vertexId) / 6;
offset = float(spriteId) * 6.0;
vertexId = int(a_vertexId) - spriteId * 6;                  (*)
tx = getFloat(texture2D(u_texSpriteData, uv(offset, u_SpriteDataSize)));
ty = getFloat(texture2D(u_texSpriteData, uv(offset + 1.0, u_SpriteDataSize)));
angle = getFloat(texture2D(u_texSpriteData, uv(offset + 2.0, u_SpriteDataSize)));
scale = getFloat(texture2D(u_texSpriteData, uv(offset + 3.0, u_SpriteDataSize)));
texId = getFloat(texture2D(u_texSpriteData, uv(offset + 4.0, u_SpriteDataSize)));
v_Color = texture2D(u_texSpriteData, uv(offset + 5.0, u_SpriteDataSize));