WebGL Multi-Layered Material

196 阅读1分钟

image.png

简单思考与解析

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