LÖVE2D安卓着色器精度限定符报错原因及修复方案咨询
在LÖVE2D Android着色器中解决浮点数精度与重载函数冲突问题
报错原因
你添加的全局精度声明修改了GLSL中float类型的默认精度,导致你定义的effect函数参数精度和LÖVE2D内置的effect重载函数参数精度不匹配。GLSL语法明确要求:重载函数的对应参数必须拥有完全一致的精度限定符。当你全局设置highp float后,你的vec4、vec2类型参数默认精度变为highp,但引擎内置的effect重载版本使用的是mediump精度,两者冲突触发了报错。
修复方法
方法1:避免全局修改精度,为特定变量单独指定高精度
直接删除你添加的全局precision指令,只在需要高精度计算的变量前显式添加highp修饰,示例:// 仅给需要高精度处理的变量指定highp highp vec2 preciseCalculation = screen_coords * 0.0001;这种方式不会影响内置函数的参数精度,从根源避免重载冲突,也是最稳妥的方案。
方法2:统一effect函数参数的精度限定符
如果你必须全局设置精度,需要给effect函数的每个参数显式声明与引擎一致的精度(通常是mediump),示例:#ifdef GL_ES #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #endif // 显式声明参数精度,与内置重载函数匹配 vec4 effect(mediump vec4 color, Image texture, mediump vec2 texture_coords, mediump vec2 screen_coords) { // 着色器逻辑 }不过这种方式需要确保参数精度完全匹配内置函数,不如方法1省心。
补充说明:论坛示例能正常运行,大概率是因为它们没有全局修改精度,或者测试环境中GL_FRAGMENT_PRECISION_HIGH未被定义,默认使用mediump精度,刚好和内置effect函数的参数精度匹配。
内容的提问来源于stack exchange,提问作者Bigfoot71
相关产品推荐
相关产品推荐

