当我执行时
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));