creator shader:从零开始 第二篇,做个动态的光影

王师傅,为啥我在编辑器预览是正常的但是在浏览器成了一坨。带佬,带带弟弟!
编辑器:


浏览器:

没勾选pakeable

我找到问题了,不用麻烦带佬了,是我自己拖错图了。

谢谢大佬,学习了!在shaderToy照着练习了一下,受益匪浅! Shader - Shadertoy BETA

最大的那一层会被第二层覆盖,感觉是在第二层的后面,次大的第二层和最小的第三层感觉是对的,
请教楼主,怎么改成移动时让最大的那一层半透明盖住第二层?即三层都是远小近大的感觉,且移动重叠时,视觉上近的会挡住远的?

看你楼上,那个看起来解决了。

看了下效果,的确是我想表达的那个意思。楼主威武!

怎么设置这些圆的透明度?

那个书还更吗,我看他说后续git上更

牛哇 厉害厉害

大佬你好,可以给新手一个机会嘛,我照着来打,还是报错了,能否给一个demo参考一下,急需这个效果

上面有人贴上了完整的代码,扒拉一下评论区就:u6709:

 // Effect Syntax Guide: https://github.com/cocos-creator/docs-3d/blob/master/zh/material-system/effect-syntax.md

CCEffect %{
  techniques:
  - name: opaque
    passes:
    - vert: general-vs:vert # builtin header
      frag: unlit-fs:frag
      properties: &props
        mainTexture:    { value: black }
        mainColor:      { value: [0, 0, 0, 1], editor: { type: color } }
        location:      {}
      # blendState:
      #   targets:
      #   - blend: true
      #     blendSrc: src_alpha
      #     blendDst: one_minus_src_alpha
      #     blendSrcAlpha: src_alpha
      #     blendDstAlpha: one_minus_src_alpha
}%

CCProgram unlit-fs %{
  precision highp float;
  #include <output>
  #include <cc-fog-fs>
  #include <cc-global>

  in vec2 v_uv;

  in float blinkTransparency;
  uniform sampler2D mainTexture;

  uniform Constant {
    vec4 mainColor;
    vec4 location[8];
  };

  float hashOld12(vec2 p){
	  return fract(sin(dot(p, vec2(12.9898, 78.233))) * 43758.5453);
  }

  float drawGird(vec2 p){
    if(p.x > 0. && p.x < 0.01){
      return 1.;
    }
    if(p.x > 0.99 && p.x < 1.){
      return 1.;
    }
    if(p.y > 0. && p.y < 0.01){
      return 1.;
    }
    if(p.y > 0.99 && p.y < 1.){
      return 1.;
    }
    return 0.;
  }


  float  drawLayer(float scale,vec2 uv)
  {
    // 注释设 scale为10的情况
    // 输出值
    float co = 0.;

    // 拷贝一份uv用,不修改原uv
    vec2 uv1 = uv;

    // uv值范围从 0-1变为 0-scale scale值为10就是0-10范围
    uv1 *= scale;

    // floor向下取整,计算出格子所在下标,
    // 10*10的格子,如果uv是 0.2345,0.2345,uv1就是2.345,2.345
    // 取整后 即为该uv所在格子下表,2,2
    // 0.2 <= uv < 0.3 该范围内所有uv坐标,处理后hv均为 2,2
    vec2 hvtemp = floor(uv1);
    
    float n = hashOld12(vec2(hvtemp.y));
    uv1.x += n;

    // floor向下取整,计算出格子所在下标,
    // 10*10的格子,如果uv是 0.2345,0.2345,uv1就是2.345,2.345
    // 取整后 即为该uv所在格子下表,2,2
    // 0.2 <= uv < 0.3 该范围内所有uv坐标,处理后hv均为 2,2
    vec2 hv = floor(uv1);

    // fr是 fract对数字取小数部分, 0.2345,0.2345 -> uv1 2.345,2.345 -> 0.345,0.345    
    // 如 0.2 <= uv < 0.3 处理后就是一个范围 0-1的范围
    vec2 fr = fract(uv1);

     // 画圆,用fr(即格内坐标)和 0.5,0.5的点的距离作为颜色值,circle范围0-0.5
    float circle = distance(fr,vec2(.5));
    
    // 上面的结果是距离值计算出来的,有明暗变化,用step把圆内都变成纯白色
    // float radius = 0.4; // 半径
    float radius = hashOld12(hv);
    float strength = radius;
    radius = radius * 0.3 + 0.1;
    float f1 = mod(floor(radius * 10.),2.); // 0 or 1
    radius *= f1;
    circle = step(radius,circle);
    
    // 1. - circle 翻转色值,使距离圆心越近颜色越亮
    circle = 1. - circle;
    circle*=strength;

    co += circle;
    co += drawGird(fr);
    return co;
  }

  vec4 frag () {
    vec4 o = vec4(0,0,0,0);
    o.xyz += drawLayer(20.,v_uv);
    o.a = 1.;
    return CCFragOutput(o);
  }
}%

改了一下 这是creator3.x 版本的 ,但是我不李姐呀,为啥这个co变量这么强大,这么多颜色和float加起来可以看到这么好看的图案,而不是一团糊掉的东西,有大佬给我解答一下是什么原理嘛?

1赞

大佬你好,我也遇到你这个问题了,但是你的回答我没看懂,我比较菜 能否贴一下你的代码我参考一下,我看不懂p是拿来的 然后off.x 用在哪

MARK学习

mark !

交作业

再次交作业了,大佬流啤
image

那个效果是苹果壁纸

膜拜大佬 改天交作业

为啥这么暗啊 是颜色色问题么
找到问题了 最后面的颜色里面 给的透明度太低了 :joy: