哎哎哎~请教一个shader问题。

    this.sprite = this.getComponent(cc.Sprite);
    var _this = this;
    this.node.on(cc.Node.EventType.TOUCH_START,function(event: cc.Event.EventTouch){
        var location = event.getLocation();
        var p = _this.node.convertToNodeSpaceAR(location);
        p.x = (p.x + _this.node.width/2.) * 0.1 / _this.node.width;
        p.y = (p.y + _this.node.height/2.) * 0.1 / _this.node.height;
        p.y = 0.1 - p.y;
        cc.log(p.toString());

        _this.sprite.getMaterial("bomb").setParamValue("bombCenter",p);
        // _this.sprite.activateMaterial("bomb");
    });

这是点击sprite,向shader传输点击的位置

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 vec4 color;
    uniform vec2 highp bombCenter;
    uniform vec3 iResolution;
    varying vec2 uv0;
    
    void main()
    { 
        vec2 highp onePixel = vec2(1.0 / iResolution.x, 1.0 / iResolution.y);
        vec4 src_color = color * texture2D(texture, uv0).rgba;
        float width = 0.01;
        float highp dis = pow(uv0.x - bombCenter.x,2) + pow(uv0.y - bombCenter.y,2);
        dis = sqrt(dis);

        gl_FragColor = src_color;

        if(dis <= width)
        { 
            gl_FragColor = vec4(0,0,0,0);
        }
    }`,

这个是shader

在学习shader,下载demo下来,自己尝试实现想要的效果。
但是一直有些问题。
1、点击的位置不在绘制出来的圆心处。
2、计算点击坐标的时候,不乘以0.1,就没法显示出来。uv0的x,y最大貌似就是0.1

按道理不是应该点击刚好绘制在圆心吗?
有人可以解答吗?

:relaxed:
没人呢

好久没弄了也不是很清楚, 在vertx计算力 传入的viewProj是这么计算的么?
关于你的问题:

  1. 位置不再圆心处应该就是这个位置计算的问题
  2. uv应该是纹理坐标范围就是0-1(x和y丢失插值texture的像素) 然后在frag里判断画小圆的这个为啥用了纹理坐标

p.x = (p.x + _this.node.width/2.) * 0.1 / _this.node.width;
p.y = (p.y + _this.node.height/2.) * 0.1 / _this.node.height;
p.y = 0.1 - p.y;

改成下面这样试试

p.x = (p.x + _this.node.width / 2.) / _this.node.width;
p.y = (p.y + _this.node.height / 2.) / _this.node.height;
p.y = 1.0 - p.y;

感谢你的回答。
这种已经尝试过了,但是失败。
这个坐标计算不是因为我除以了10.
而是我查看shader里面的uv0,发现纹理坐标(uv0)的区间是0-0.1(通过增加uv0.x的范围来确定)。
所以才把传入的坐标参数除以10.

然而就是不知道哪里的问题导致缩小了10倍

感谢你的解答
第一个viewProj我也没搞明白为啥要这么计算。
demo里面是这么计算的,我就复制过来了。
我看opengl的文档没找到(主要是不知道这个叫啥)

是的,我查看资料,纹理坐标是0-1的。
但是我尝试过在我的项目中调试,发现只有0-0.1,0.1刚好可以把全部纹理绘制完成。
但是在demo里面,uv就是0-1,这个困扰了我很久;
demo代码在我项目中,也会因为这个区间问题导致绘制失败。

看了几天源码都没有头绪
真脑壳疼:joy:

viewProj这个是坐标转换,从模型空间转到摄像机空间

这个uv坐标,0~0.1真的是蛋疼

var p = _this.node.convertToNodeSpace(location);// 换成这个坐标转换
p.x = p.x / _this.node.width;
p.y = p.y / _this.node.height;
p.y = 1 - p.y;

另外纹理没有使用引擎自带的自动图集对吧。

感谢回答:joy:好久前的问题了,最后还是没找到答案。已弃
只有那个项目有这个问题,后面新建的项目暂时没有出现

不验证一下么?

convertToNodeSpace和convertToNodeSpaceAR是不一样的

2.1.2的uv终于正常了

引擎的锅么

我是验证了,没找到问题。
因为没法在其他项目复现。:joy:所以最后才弃了

是啊,后面没有复现了