变量
- diffuse 是用户输入的颜色值
- map 是diffuseMap 是模型的贴图
Shader里的颜色处理
- diffuse 用户输入的颜色值(含alpha值的)
vec4 diffuseColor = vec4( diffuse, opacity );
#ifndef USE_MAP
diffuseColor.rgb = pow(diffuseColor.rgb, vec3(2.2));
#ifdef USE_GRADIENT
#ifdef VERSION_1_3_0
#ifndef STANDARD_SG
#else
diffuseColor.rgb = colorGradient();
#endif
#else
diffuseColor.rgb = colorGradient();
#endif
#endif
#endif
- 贴图里的颜色
- standard 情况下 diffuseColor和贴图color计算方式
- 需要判断输入色阶与输出色阶 NEED_ADJUST_COLOR
- 需要判断渐变色 USE_GRADIENT
- 非standard (ThreeJS) 默认情况下的计算方式
#ifdef USE_MAP
vec4 texelColor = texture2D( map, vUv );
texelColor = mapTexelToLinear( texelColor );
#ifdef DECOLOR //灰度
float gray = texelColor.r * 0.3 + texelColor.g * 0.59 + texelColor.b * 0.11;
texelColor.r = gray;
texelColor.g = gray;
texelColor.b = gray;
#endif
// Tips:
// 1.所有改色函数只影响RGB
// 2.改色函数里会对diffuseColor做gamma
#ifdef STANDARD
#ifdef VERSION_1_3_0
#ifdef NEED_ADJUST_COLOR
diffuseColor.rgb = changeColorV130(texelColor, gradationInputBlack, gradationInputWhite, gradationGamma, gradationOutputBlack, gradationOutputWhite, diffuseColor).rgb;
#else
#ifndef STANDARD_SG //不支持改色
diffuseColor.rgb = pow(diffuseColor.rgb, vec3(2.2));
diffuseColor.rgb *= texelColor.rgb;
#else
#ifdef USE_GRADIENT
diffuseColor.rgb = colorGradient();
diffuseColor.rgb = changeColorV130(texelColor, gradationInputBlack, gradationInputWhite, gradationGamma, gradationOutputBlack, gradationOutputWhite, diffuseColor).rgb;
#else
diffuseColor.rgb = texelColor.rgb;
#endif
#endif
#endif
#else
#ifdef NEED_ADJUST_COLOR
diffuseColor.rgb = changeColorV130(texelColor, gradationInputBlack, gradationInputWhite, gradationGamma, gradationOutputBlack, gradationOutputWhite, diffuseColor).rgb;
#else
#ifdef USE_GRADIENT
diffuseColor.rgb = colorGradient();
diffuseColor.rgb = changeColorV130(texelColor, gradationInputBlack, gradationInputWhite, gradationGamma, gradationOutputBlack, gradationOutputWhite, diffuseColor).rgb;
#else
diffuseColor.rgb = texelColor.rgb;
#endif
#endif
#endif
diffuseColor.a *= texelColor.a;
#ifdef MAP_CLAMP_TO_EDGE
if (vUv.x >= 0.0 && vUv.x <= 1.0 && vUv.y >= 0.0 && vUv.y <= 1.0) {
}
else {
diffuseColor.a = 0.0;
}
#endif
#ifdef DISCARD_MAP_ALPHA
if(texelColor.a<0.001) discard;
#endif
#else
diffuseColor *= texelColor; //颜色的乘值
#endif
#endif