ccc 2.4.4
按照大佬的代码改的shader,想实现可变数量多个光源的2d场景。
浏览器无报错结果正常,模拟器报错
新手求解答。。。
CCEffect %{
techniques:
- passes:
- vert: vs
frag: fs
blendState:
targets:
- blend: true
rasterizerState:
cullMode: none
properties:
texture: { value: white }
alphaThreshold: { value: 0.5 }
light_radius: { value: 0.2 }
//传入的数组
light_prop: {value: [-1.0, -1.0, -1.0, -1.0]}
light_strength: {value: 0.1}
dummy: {value: 0.1}
wh_ratio: {value: 1.0}
}%
CCProgram vs %{
precision highp float;
#include <cc-global>
#include <cc-local>
in vec3 a_position;
in vec4 a_color;
out vec4 v_color;
out vec4 fragPos;
#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;
// TODO: optimization
fragPos = cc_matWorld *vec4(a_position, 1);
}
}%
CCProgram fs %{
precision highp float;
#include <alpha-test>
#include <texture>
in vec4 v_color;
in vec4 fragPos;
#if USE_TEXTURE
in vec2 v_uv0;
uniform sampler2D texture;
#endif
uniform LIGHT {
// 光照半径
float light_radius;
// 漫反射环境光强度
float light_strength;
// 界面宽高比
float wh_ratio;
float dummy;
// 光照中心点
vec4 light_prop[256];
};
void main () {
vec4 o = vec4(1, 1, 1, 1);
#if USE_TEXTURE
CCTexture(texture, v_uv0, o);
#endif
o *= v_color;
ALPHA_TEST(o);
float result = light_strength;
for (int i=0;i<256;i++) {
// 光的强度 light_prop[i].z,小于0标志读取完毕所有光源
if (light_prop[i].z < 0.0) {
break;
}
// 光的位置 light_prop[i].x,light_prop[i].y
float dist = sqrt(pow(fragPos.x * wh_ratio - light_prop[i].x * wh_ratio, 2.0) + pow(fragPos.y - light_prop[i].y, 2.0));
// 叠加所有光照强度
result = result + 1.0/(dist+1.0)*light_prop[i].z;
}
gl_FragColor = vec4(o.r * result, o.g * result, o.b * result, 1.0);
}
}%