
简单思考与解析
MAX_LAYERS
#define MAX_LAYERS 3
#ifdef USE_BRDF
#if (MAX_LAYERS > 0) //MAX_LAYERS
uniform float BRDFEnabled[MAX_LAYERS];
uniform float BRDFSubsurfaces[MAX_LAYERS]; //次表面
uniform float BRDFMetallics[MAX_LAYERS]; //金属
uniform float BRDFSpeculars[MAX_LAYERS]; //高光?
uniform float BRDFSpecularTints[MAX_LAYERS];
uniform float BRDFRoughnesses[MAX_LAYERS]; //粗糙度
uniform float BRDFAnisotropics[MAX_LAYERS]; //各向异性
uniform float BRDFSheens[MAX_LAYERS]; //sheen
uniform float BRDFSheenTints[MAX_LAYERS];
uniform float BRDFClearcoats[MAX_LAYERS]; //清漆
uniform float BRDFClearcoatRoughnesses[MAX_LAYERS];
uniform float BRDFBrightnesses[MAX_LAYERS]; //
uniform float BRDFExposures[MAX_LAYERS];
uniform float BRDFGammas[MAX_LAYERS];
#endif
varying vec3 vTangent;
varying vec3 vBinormal;
#endif
#if (MAX_LAYERS > 0)
uniform int mapIndex[MAX_LAYERS]; //int来的 只是判断哪个是最上面那层
uniform vec3 mColor[MAX_LAYERS]; //颜色 //这两个有一定业务逻辑
uniform vec3 mAmbient[MAX_LAYERS]; //环境颜色
uniform vec3 mSpecular[MAX_LAYERS]; //高光颜色
uniform vec3 mEmissive[MAX_LAYERS]; //自发光颜色
uniform float mShininess[MAX_LAYERS];
uniform float mMetal[MAX_LAYERS];
uniform float mOpacity[MAX_LAYERS];
#endif
vec4 fragColors[MAX_LAYERS];
多层Maps
#if defined( USE_MAP )
if (w == 0) {
#if defined(SHADER_TEXTURE_LOD) && ( defined(USE_DISPLACEMAP) || (MAX_DISPLACEMAPS > 0) )
texelColor = texture2DLodEXT( map, mapUv + dispOffsetUv, 0. );
#else
texelColor = texture2D( map, mapUv + dispOffsetUv );
#endif
}
#if (MAX_MAPS > 0)
else {
for (int z = 0; z<MAX_MAPS; z++) {
if (z == mdx) {
#if defined(SHADER_TEXTURE_LOD) && ( defined(USE_DISPLACEMAP) || (MAX_DISPLACEMAPS > 0) )
texelColor = texture2DLodEXT( maps[z], mapUvs[z] + dispOffsetUvs[z], 0. );
#else
texelColor = texture2D( maps[z], mapUvs[z] + dispOffsetUvs[z] );
#endif
}
}
mdx++;
}
#endif
#elif (MAX_MAPS > 0)
for (int z = 0; z<MAX_MAPS; z++) {
if (z == mdx) {
#if defined(SHADER_TEXTURE_LOD) && ( defined(USE_DISPLACEMAP) || (MAX_DISPLACEMAPS > 0) )
texelColor = texture2DLodEXT( maps[z], mapUvs[z] + dispOffsetUvs[z], 0. );
#else
texelColor = texture2D( maps[z], mapUvs[z] + dispOffsetUvs[z] );
#endif
}
}
mdx++;
#endif
#ifdef GAMMA_INPUT
texelColor.xyz *= texelColor.xyz;
#endif
fragColor = fragColor * texelColor;
#if (MAX_LAYERS > 0)
vec4 texelColor = fragColors[0]; //第一个
float maxAlpha = texelColor.a; //第一个
for (int i = 1; i<MAX_LAYERS; i++) {
vec4 tB = fragColors[i];
texelColor = vec4(texelColor.rgb * texelColor.a * (1.0 - tB.a) + tB.rgb * tB.a, 1.0);
maxAlpha = max(tB.a, maxAlpha);
}
gl_FragColor = vec4(texelColor.rgb, maxAlpha);
#endif
整体的架构(没有细看)
for (int w = 0; w<9; w++) {
dispOffsetUvs[w] = vec2(0.0);
}
#if defined( USE_DISPLACEMAP ) || ( MAX_DISPLACEMAPS > 0 ) //顶点位移贴图
#ifdef USE_SPECULARMAP //高光贴图
#if (MAX_SPECULARMAPS > 0)
#ifdef USE_BRDF
#ifdef USE_METALROUGHMAP
#if (MAX_METALROUGHMAPS > 0)
#ifdef USE_SPECGLOSSMAP
#if (MAX_SPECGLOSSMAPS > 0)
vec3 normal = normalize( vNormal ); //计算法线
#ifdef DOUBLE_SIDED //计算法线
#ifdef STANDARD_DERIVATIVES //计算法线
#if defined( USE_NORMALMAP ) || ( MAX_NORMALMAPS > 0 )
#if defined( USE_BUMPMAP ) || ( MAX_BUMPMAPS > 0 )
for (int w = 0; w<MAX_LAYERS; w++) {
#if defined( USE_MAP )
#ifdef GAMMA_INPUT
#ifdef USE_BRDF
#ifdef FORWARD_TILED_RENDER
#if (MAX_POINT_LIGHTS > 0)
#if (MAX_SPOT_LIGHTS > 0)
#if (MAX_DIR_LIGHTS > 0)
#if (MAX_AREA_LIGHTS > 0)
#if (MAX_HEMI_LIGHTS > 0)
#if (MAX_DIR_LIGHTS > 0)
#if (MAX_HEMI_LIGHTS > 0)
#if (MAX_POINT_LIGHTS > 0)
#ifdef FORWARD_TILED_RENDER
#if (MAX_SPOT_LIGHTS > 0)
#if (MAX_AREA_LIGHTS > 0)
#ifdef USE_BRDF
#if (MAX_SPOT_LIGHT_GELS > 0)
#if (MAX_AREA_LIGHT_GELS > 0)
fragColors[w] = fragColor;
}
gl_FragColor = vec4(texelColor.rgb, maxAlpha);//汇总
#ifdef USE_LIGHTMAP
#ifdef USE_COLOR
#ifdef USE_INSTANCED_ATTRB
#ifdef USE_ENVMAP
#if defined( USE_REFLECTMAP ) || defined( USE_REFRACTMAP )
#ifdef GAMMA_OUTPUT
#ifdef USE_FOG
#ifdef USE_INSTANCED_ATTRB
#ifdef USE_ALPHAMAP
#if (MAX_ALPHAMAPS > 0)
#ifdef ALPHATEST
#ifdef PREMULTIPLIED_ALPHA