【萌新求解】 2.4.1 shader 的uniform在creator的使用方法

刚开始学shader,看的The Book of Shaders。

问题一:


像教程里的 uniform float u_time; 在编辑器会报错 non-sampler uniforms must be declared in blocks.
改成 uniform Shader { float u_time; }; 的话编译不报错,但是跑起来没效果,颜色一直都不会改变
改成cc_time.x就可以正常跑,是不是glsl里的u_time都需要用cc_time.x代替了?

问题二:


u_resolution在creator里要怎么写?尝试了一下
vec2 st = gl_FragCoord.xy/u_resolution; 改成 => vec2 st = gl_FragCoord.xy/cc_screenSize.xy;
发现毫无效果

问题三:
glsl的u_mouse在creator只能通过参数传进去?

问题四:
文档上的cc_nativeSize编译的时候报错,说没有这个东西?

问题五:
shader有没什么打log或者调试的方法,只看效果图写起来有时有点懵逼 :sweat_smile:

1赞

1、uniform这些参数都是程序传入进去的,所以不能完全照搬书上的, cc_time好像是#include
#include 这些里面creator自己传进去的。
2、u_resolution,u_mouse 这些非官方的应该都只能自己传入。
3、shader确实不好调试,头大

谢大佬,那这个例子里的u_resolution要怎么写?

uniform Shader {
vec4 u_resolution = vec4(512.0,512.0,1.0,1.0);
};

void main () {
vec2 st = gl_FragCoord.xy/u_resolution.xy;
gl_FragColor = vec4(st.x,st.y,0.0,1.0);
}

我建了一个node尺寸是512x512,然后u_resolution写死了512x512,但是效果图只显示黄色

u_resolution 是渲染的大小吧, 你是使用的sprite组件吗? 这个和Sprite类型和SpriteFrame的裁剪有关, 不是单纯的节点大小

uniform ARGS {//UBO
      vec2 u_resolution;
      vec2 u_mouse;
       float u_time;
};

注意这里的 ;


resolution 改为 >###vec2 st = v_uv0.xy;//gl_FragCoord/u_resolution;
1赞

对,用的是sprite,贴图也是512x512

!!!
这个v_uv0是什么神奇的东西,求解。 效果图刚好跟gl_FragCoord/u_resolution上下倒转了

// float y = st.x;
改成这个 就不会上下了。 float y =1.0 - pow(st.x,5.0);
v_uv0 这个说来就话长了。uv坐标 嗯…先把基础搞懂吧。

谢大佬,好像有点明白了,The Book of Shaders上面的几个u_XXXX都是框架自己实现的吧,移植到creator得用creator内置的uniform换掉或者自己实现

#if USE_TEXTURE
in vec2 v_uv0;
#endif

v_uv0看到有定义了,刚才还以为是内置变量

https://www.bilibili.com/read/cv6451811
定点着色器->传递给片元着色器。 这期间就有很多需要传递的。 定点坐标位置信息等等。可以看下这个视频
https://www.bilibili.com/video/BV1kE41197Zs 我觉得这个人对基础分析还是挺到位的。

:grin:好,去学习了