// Copyright (c) 2017-2019 Xiamen Yaji Software Co., Ltd. CCEffect %{ techniques: - name: opaque passes: - vert: standard-vs:vert frag: standard-fs:frag properties: &props tilingOffset: { value: [1.0, 1.0, 0.0, 0.0] } rimLightColor: { value: [1.0, 1.0, 1.0, 1.0], target: rimColor, editor: { displayName: Rim Color, type: color } } mainColor: { value: [1.0, 1.0, 1.0, 1.0], target: albedo, editor: { displayName: Albedo, type: color } } albedoScale: { value: [1.0, 1.0, 1.0], target: albedoScaleAndCutoff.xyz } alphaThreshold: { value: 0.5, target: albedoScaleAndCutoff.w, editor: { parent: USE_ALPHA_TEST } } occlusion: { value: 1.0, target: pbrParams.x } roughness: { value: 0.8, target: pbrParams.y } metallic: { value: 0.6, target: pbrParams.z } normalStrenth: { value: 1.0, target: pbrParams.w, editor: { parent: USE_NORMAL_MAP } } emissive: { value: [0.0, 0.0, 0.0, 1.0], editor: { type: color } } emissiveScale: { value: [1.0, 1.0, 1.0], target: emissiveScaleParam.xyz } mainTexture: { value: grey, target: albedoMap, editor: { displayName: AlbedoMap } } normalMap: { value: normal } pbrMap: { value: grey } metallicRoughnessMap: { value: grey } occlusionMap: { value: white } emissiveMap: { value: grey } migrations: &migs # existing material data migration properties: mainColor: { formerlySerializedAs: albedo } alphaThreshold: { formerlySerializedAs: albedoScale.w } normalStrenth: { formerlySerializedAs: pbrScale.w } mainTexture: { formerlySerializedAs: albedoMap } - name: transparent passes: - vert: standard-vs:vert frag: standard-fs:frag depthStencilState: depthTest: true depthWrite: false blendState: targets: - blend: true blendSrc: src_alpha blendDst: one_minus_src_alpha blendDstAlpha: one_minus_src_alpha properties: *props migrations: *migs }% CCProgram shared-ubos %{ uniform Constants { vec4 tilingOffset; vec4 rimColor; vec4 albedo; vec4 albedoScaleAndCutoff; vec4 pbrParams; vec4 emissive; vec4 emissiveScaleParam; vec4 fogParams; }; }% CCProgram standard-vs %{ precision highp float; #include #include #include #include #if USE_VERTEX_COLOR in vec3 a_color; out vec3 v_color; #endif out vec3 v_position; out vec3 v_normal; out vec3 v_view_normal; out vec3 v_view_position; #if USE_NORMAL_MAP out vec3 v_tangent; out vec3 v_bitangent; #endif in vec2 a_texCoord; out vec2 v_uv; in vec2 a_texCoord1; out vec2 v_uv1; #if USE_LIGHTMAP && !USE_BATCHING && !USE_INSTANCING out vec2 v_luv; #endif vec4 vert () { StandardVertInput In; CCVertInput(In); mat4 matWorld, matWorldIT; CCGetWorldMatrixFull(matWorld, matWorldIT); vec4 pos = matWorld * In.position; v_position = pos.xyz; vec4 normal = vec4(In.normal,0.0); v_normal = normalize((matWorldIT * normal).xyz); v_view_normal = normalize(((cc_matView * matWorldIT) * normal).xyz); vec4 vpos = (cc_matView * matWorld) * In.position; v_view_position = vpos.xyz; #if USE_NORMAL_MAP v_tangent = normalize((matWorld * vec4(In.tangent.xyz, 0.0)).xyz); v_bitangent = cross(v_normal, v_tangent) * In.tangent.w; // note the cross order #endif v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw; #if HAS_SECOND_UV v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw; #endif #if USE_VERTEX_COLOR v_color = a_color; #endif #if USE_LIGHTMAP && HAS_SECOND_UV && !USE_BATCHING && !USE_INSTANCING v_luv = cc_lightingMapUVParam.xy + a_texCoord1 * cc_lightingMapUVParam.zw; #endif return cc_matProj * (cc_matView * matWorld) * In.position; } }% CCProgram standard-fs %{ precision highp float; #include #include #include #include #include in vec3 v_position; in vec3 v_view_position; in vec2 v_uv; in vec2 v_uv1; in vec3 v_normal; in vec3 v_view_normal; #if USE_VERTEX_COLOR in vec3 v_color; #endif #if USE_ALBEDO_MAP uniform sampler2D albedoMap; #pragma define ALBEDO_UV options([v_uv, v_uv1]) #endif #if USE_NORMAL_MAP in vec3 v_tangent; in vec3 v_bitangent; uniform sampler2D normalMap; #pragma define NORMAL_UV options([v_uv, v_uv1]) #endif #if USE_PBR_MAP uniform sampler2D pbrMap; #pragma define PBR_UV options([v_uv, v_uv1]) #endif #if USE_METALLIC_ROUGHNESS_MAP uniform sampler2D metallicRoughnessMap; #pragma define METALLIC_ROUGHNESS_UV options([v_uv, v_uv1]) #endif #if USE_OCCLUSION_MAP uniform sampler2D occlusionMap; #pragma define OCCLUSION_UV options([v_uv, v_uv1]) #endif #if USE_EMISSIVE_MAP uniform sampler2D emissiveMap; #pragma define EMISSIVE_UV options([v_uv, v_uv1]) #endif #if USE_LIGHTMAP in vec2 v_luv; #pragma builtin(local) layout(binding = 30) uniform sampler2D cc_lightingMap; #endif #pragma define OCCLUSION_CHANNEL options([r, g, b]) #pragma define ROUGHNESS_CHANNEL options([g, b, r]) #pragma define METALLIC_CHANNEL options([b, r, g]) #if USE_ALPHA_TEST #pragma define ALPHA_TEST_CHANNEL options([a, r]) #endif void surf (out StandardSurface s) { vec4 baseColor = albedo; #if USE_VERTEX_COLOR baseColor.rgb *= v_color; #endif #if USE_ALBEDO_MAP vec4 texColor = texture(albedoMap, ALBEDO_UV); texColor.rgb = SRGBToLinear(texColor.rgb); baseColor *= texColor; #endif s.albedo = baseColor; s.albedo.rgb *= albedoScaleAndCutoff.xyz; #if USE_ALPHA_TEST if (s.albedo.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard; #endif //fog compute float density = 0.001;//fogParams.w; float dist2 = dot(v_view_position,v_view_position); float fogFactor = exp( -density*density * dist2); fogFactor = clamp(fogFactor, 0.0, 1.0); vec3 fogColor = vec3(1.0,1,1.0);//fogParams.xyz; s.albedo.rgb = mix(fogColor,s.albedo.rgb,fogFactor); s.normal = v_normal; #if USE_NORMAL_MAP vec3 nmmp = texture(normalMap, NORMAL_UV).xyz - vec3(0.5); s.normal = (nmmp.x * pbrParams.w) * normalize(v_tangent) + (nmmp.y * pbrParams.w) * normalize(v_bitangent) + nmmp.z * normalize(s.normal); #endif s.position = v_position; vec4 pbr = pbrParams; #if USE_PBR_MAP vec4 res = texture(pbrMap, PBR_UV); pbr.x *= res.OCCLUSION_CHANNEL; pbr.y *= res.ROUGHNESS_CHANNEL; pbr.z *= res.METALLIC_CHANNEL; #endif #if USE_METALLIC_ROUGHNESS_MAP vec4 metallicRoughness = texture(metallicRoughnessMap, METALLIC_ROUGHNESS_UV); pbr.z *= metallicRoughness.METALLIC_CHANNEL; pbr.y *= metallicRoughness.ROUGHNESS_CHANNEL; #endif #if USE_OCCLUSION_MAP pbr.x *= texture(occlusionMap, OCCLUSION_UV).OCCLUSION_CHANNEL; #endif s.occlusion = clamp(pbr.x, 0.0, 0.96); s.roughness = clamp(pbr.y, 0.04, 1.0); s.metallic = pbr.z; s.emissive = emissive.rgb * emissiveScaleParam.xyz; #if USE_EMISSIVE_MAP s.emissive *= SRGBToLinear(texture(emissiveMap, EMISSIVE_UV).rgb); #endif } vec4 frag () { StandardSurface s; surf(s); vec4 color = CCStandardShading(s); #if USE_LIGHTMAP && !USE_BATCHING && !USE_INSTANCING vec4 lighting = texture(cc_lightingMap, v_luv); float fAmb = 0.5 - s.normal.y * 0.5; vec3 ambDiff = mix(cc_ambientSky.rgb, cc_ambientGround.rgb, fAmb) * cc_ambientSky.w; vec3 finalColor = (ambDiff.rgb * s.albedo.rgb); finalColor += lighting.rgb * s.albedo.rgb; finalColor = finalColor * s.occlusion; finalColor += s.emissive; color.rgb = lighting.a * finalColor + (1.0 - lighting.a) * color.rgb; #endif float fRim = (1.0 - dot(normalize(v_view_normal),vec3(0,0,1.0))) * rimColor.w; color.rgb = mix(color.rgb,rimColor.rgb,fRim); //color.rgb = mix(vec3(0.0,0.0,0.0),rimColor.rgb,fRim); return CCFragOutput(color); } }%