在cocoscreator中新建一个effect,内容如下
// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd.
CCEffect %{
techniques:
- passes:
- vert: vs
frag: fs
blendState:
targets:
- blend: true
rasterizerState:
cullMode: none
properties:
texture: { value: white }
alphaThreshold: { value: 0.5 }
}%
CCProgram vs %{
precision highp float;
#include <cc-global>
#include <cc-local>
in vec3 a_position;
in vec4 a_color;
out vec4 v_color;
#if USE_TEXTURE
in vec2 a_uv0;
out vec2 v_uv0;
#endif
void main () {
vec4 pos = vec4(a_position, 1);
#if CC_USE_MODEL
pos = cc_matViewProj * cc_matWorld * pos;
#else
pos = cc_matViewProj * pos;
#endif
#if USE_TEXTURE
v_uv0 = a_uv0;
#endif
v_color = a_color;
gl_Position = pos;
}
}%
CCProgram fs %{
precision highp float;
#include <alpha-test>
in vec4 v_color;
#if USE_TEXTURE
in vec2 v_uv0;
uniform sampler2D texture;
#endif
void main () {
vec4 o = vec4(1, 1, 1, 1);
#if USE_TEXTURE
o *= texture(texture, v_uv0);
#if CC_USE_ALPHA_ATLAS_TEXTURE
o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;
#endif
#endif
o *= v_color;
ALPHA_TEST(o);
gl_FragColor = o;
}
}%
官方的effect文档 https://docs.cocos.com/creator/manual/zh/render/effect.html?h=shader
因为没有shader基础,看不明白
新建一个material,选择刚刚新建的effect,把这个材质放到一个sprite上
这个sprite没有发生任何变化,因为新建的effect和默认的builtin-2d-sprite内容一样。
现在尝试更改一下new effect之中的内容
通过对比别人制作的effect,发现有下图fs部分发生了改变,其他部分的内容暂时先不管
image.png
#if USE_TEXTURE
o *= texture(texture, v_uv0);
#if CC_USE_ALPHA_ATLAS_TEXTURE
o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;
#endif
#endif
猜测这个USE_TEXTURE应该就是material面板上面的两个Boolean类型的变量,取消勾选试一试,果然精灵变成了纯白色
image.png image.png因为这个if没有走进去,,直接使用了vec4 o = vec4(1,1,1,1);
这个颜色就是白色。
4个数字分别代表rgba,范围0-1
再把USE_TEXTURE勾选上,恢复正常
现在试试o.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;这一句的作用,把他注释掉
image.png
sprite没有发生变化,猜测是CC_USE_ALPHA_ATLAS_TEXTURE为false,把if中的代码移到外面试试
image.png
image.png
图片发生了奇怪的变化,把这几句删除掉
下面应该就是正常显示图片的代码了
image.png
通过搜索,找到这篇文章,介绍了gl_FragColor = o;的作用,gl_FragColor里面保存的是图片的颜色。
https://www.jianshu.com/p/75b1b4b701f7
网友评论