3 回答
TA贡献1798条经验 获得超7个赞
所以最终结果是两个问题的混合体:
1) 运算符 % 在 OGL 3.2 和 OGLES 3.0 中的工作方式不同。在前者中,即使操作数为负数,它也始终返回正整数。即 3 % 2 = -3 % 2 = 1 然而,在 OpenGL ES 中,它实际上保留了符号。
2)这是一个精度问题。我正在高正坐标中工作,因此我的 vertexPosition 坐标最终在 10k 正值范围内。当我计算总和时,它可能会达到20k。似乎即使是 highP float 也不足以在如此高的数字下保持足够的精度,所以它最终会崩溃。这是奇数,因为高精度范围显示为 -2^127~~2^127,这对于我的计算来说应该足够了。但事实并非如此。我的解决方案是标准化坐标,将值减小到 <10。
如果有人可以进一步详细说明我可以做的事情 - 请告诉我!
TA贡献1808条经验 获得超4个赞
我将发布我对这个问题的最终答案,这是经过大量努力、搜索和反复试验的结果。实际上,屏幕截图中描绘了两个独立的问题,因此我将同时介绍这两个问题。
关于多边形交叉点上奇怪的纹理偏移。已确认这是 Vivante 驱动程序问题。对于片段着色器来说,位于截锥体之外太远的点的坐标计算错误(请注意,它们在顶点着色器中完全正常,因此平面不会出现撕裂 - 只有纹理受到影响)。
目前似乎没有驱动程序修复。
但是,您可以实施一种解决方法。分割网格。不要使用由 2 个三角形组成的大四边形,而是用几个较小的四边形构建它。在我的例子中,我制作了一个 6x6 结构,总共 36 个四边形和 64 个三角形。这样,任何点都不会超出截锥体,并且精度看起来很好。
是的,这远非理想,但它比让片段着色器产生视觉伪影要好。
关于颜色。您可能会注意到,在屏幕截图中,颜色最终变为灰色和黑色,而它们应该是浅灰色和深灰色。
解决方案并不容易达成。这是系统区域设置。
你们中的一些人可能甚至没有意识到,在某些斯拉夫语言环境中,分隔符是逗号,而不是点。所以基本上是这样的:
fragColor = vec4(vec3(c/2.0 + 0.3), 1);
变成
fragColor = vec4(vec3(c/2 , 0 + 0 , 3), 1);
正如你可以猜到的,这是完全错误的。事实上,令我印象深刻的是,GLSL 似乎对此完全没问题,并且不会给出任何运行时错误。可能是因为 vec3 在创建过程中可以采用 3 个坐标,或者其他什么。无论如何,这个bug使得我代码中的所有浮点常量完全错误,并且得到的计算结果也是错误的。
以防万一有人遇到这个问题。
添加回答
举报