这段shader啥问题?

const renderEngine = cc.renderer.renderEngine;
const renderer = renderEngine.renderer;
let CustomMaterial = require('CustomMaterial');

const shader = {
    name: 'Laser',
    params: [
        { name: 'color', type: renderer.PARAM_FLOAT3,defaultValue: new cc.Vec3(0,0,1)},
    ],

    start() {

    },

    update(sprite, material) {
    },

    defines:[],

    vert: `
        uniform mat4 viewProj;
        attribute vec3 a_position;
        attribute vec2 a_uv0;
        varying vec2 uv0;
        void main () {
            vec4 pos = viewProj * vec4(a_position, 1);
            gl_Position = pos;
            uv0 = a_uv0;
        }`,

    frag:`
    
        uniform sampler2D texture;
        uniform vec3 color;
        varying vec2 uv0;
        
        void main()
        {
            vec4 src_color = texture2D(texture, uv0);
            src_color.rgb *= color.xyz;

            if(uv0.x < 0.45) {
                src_color.a = uv0.x;
            }else if (uv0.x > 0.55) {
                src_color.a = (1 - uv0.x);
            }else {
                src_color.r += 0.1 + uv0.x;
                src_color.g += 0.1 + uv0.x;
                src_color.b += 0.1 + uv0.x;
            }
            gl_FragColor = src_color;
        }`,
};

CustomMaterial.addShader(shader);

使用了ShaderHelper的模版。
模拟器一直没问题,但是一到浏览器和真机就会失效
报错“Failed to use program: has not linked yet.”
然而我不知道如何定位这个问题,求助:cry:

妈耶,经过我逐个排除:joy:,最后发现是精度问题。
src_color.a = (1 - uv0.x);改为:src_color.a = (1.0 - uv0.x);
就好了,这种bug太恐怖了

你说的这个,不是精度问题吧,这怕是语法错误吧

1是,1.0和1. 一样的是float:slightly_smiling:

我觉得是整型和浮点型不能直接运算的问题,所以才说精度问题。

我之前看了一点点glsl,说的是不支持动态类型转换,也就是说1 + 3.0的写法是错的,不会自动给你把1转为浮点类型。

原来如此,不知道模拟器用的是什么,模拟器是没有报错的,但是浏览器和真机会保错