我在Andorid设备上使用OpenGL ES 2.0进行了一些全屏渲染。
在这些渲染中,我使用了一个自定义片段着色器,它使用统一的时间参数作为动画的一部分。
随着渲染的进行,我经历了主要的图像撕裂/大量fps下降和像素化结果。
在玩了数值并尝试修复它之后,我发现问题在于时间参数的大小,因为值越来越大,结果越来越差。
在片段着色器中将浮点精度更改为highp
没有帮助,但动画在之前的某个时间变得更糟,正如您所期望的那样。
我通过在它上面使用mod运算符将参数的大小限制在发送到着色器之前找到了解决方案。
另一方面,我将确切的着色器代码复制到运行web-gl环境的浏览器中,以呈现在手机上运行的相同内容,并且参数大小没有问题,没有fps下降,没有什么都没有。
我可以理解移动设备上的显卡比我在电脑上的显卡要弱一些,并且很自然地认为我的显卡可以容纳更大的值。
但是,我的问题是,我可以使用哪种可能的解决方案解决参数大小问题?
我希望我的动画永远继续*,并且不会被迫在5秒后循环播放。
以下是带有动画的网站链接:website link
*实际上不是永远,而是相当长的一段时间,就像在眉毛中一样。
答案 0 :(得分:0)
如果uFloat用于表示时间戳,我建议以毫秒或纳秒为单位传递一个unix时间戳,作为int或long。我不知道它将如何解决帧率问题,但如果你的困境的原因与时间戳的精确度有关,那么这可能会解决这个问题。
编辑:根据评论,这可能是一个精确的问题。随着uFloat值的增加,它的尾数会慢慢失去精度。很可能发生的事情是uFloat的增量增加太低。你想要为调试目的做的是吐出每帧为uFloat值生成的浮点数的全部,并逐帧比较它们以查看数字是否每帧都停止增加。