1
0
forked from Rowland/EG
EG/RenderPipelineFile/effects/material_blend4.yaml
2025-07-24 11:37:46 +08:00

90 lines
3.5 KiB
YAML

# This effect blends 4 materials based on a material map
# The textures should be setup like in the 04-Material-Blending sample.
# The last material is the base material and thus has no blending. It will
# be wherever no other material is.
vertex:
fragment:
inout: |
uniform sampler2D p3d_Texture0; // Alpha - Map
uniform sampler2D p3d_Texture1; // M1 - Diffuse
uniform sampler2D p3d_Texture2; // M1 - Normal
uniform sampler2D p3d_Texture3; // M1 - Specular
uniform sampler2D p3d_Texture4; // M1 - Blendmap
uniform sampler2D p3d_Texture5; // M2 - Diffuse
uniform sampler2D p3d_Texture6; // M2 - Normal
uniform sampler2D p3d_Texture7; // M2 - Specular
uniform sampler2D p3d_Texture8; // M2 - Blendmap
uniform sampler2D p3d_Texture9; // M3 - Diffuse
uniform sampler2D p3d_Texture10; // M3 - Normal
uniform sampler2D p3d_Texture11; // M3 - Specular
uniform sampler2D p3d_Texture12; // M3 - Blendmap
uniform sampler2D p3d_Texture13; // M4 - Diffuse
uniform sampler2D p3d_Texture14; // M4 - Normal
uniform sampler2D p3d_Texture15; // M4 - Specular
uniform sampler2D p3d_Texture16; // M4 - Blendmap
uniform float detail_scale_factor;
uniform float material_0_pow;
uniform float material_0_add;
uniform float material_1_pow;
uniform float material_1_add;
uniform float material_2_pow;
uniform float material_2_add;
defines: |
#define DONT_FETCH_DEFAULT_TEXTURES 1
#define DONT_SET_MATERIAL_PROPERTIES 1
material: |
// Get detail coordinate
vec2 detail_coord = texcoord * detail_scale_factor;
vec4 layers = texture(p3d_Texture0, texcoord);
layers.xyz *= layers.w;
// Blend all materials
layers.x = blend_material(layers.x, texture(p3d_Texture4, detail_coord).x, material_0_add, material_0_pow);
layers.y = blend_material(layers.y, texture(p3d_Texture8, detail_coord).x, material_1_add, material_1_pow);
layers.z = blend_material(layers.z, texture(p3d_Texture12, detail_coord).x, material_2_add, material_2_pow);
layers.w = saturate(1.0 - dot(layers.xyz, vec3(1))); // More inituitive
// Diffuse
vec3 m_base = vec3(0);
m_base = texture(p3d_Texture1, detail_coord).xyz * layers.x;
m_base += texture(p3d_Texture5, detail_coord).xyz * layers.y;
m_base += texture(p3d_Texture9, detail_coord).xyz * layers.z;
m_base += texture(p3d_Texture13, detail_coord).xyz * layers.w;
// Normal
vec3 m_nrm = vec3(0);
m_nrm += unpack_texture_normal(texture(p3d_Texture2, detail_coord).xyz) * layers.x;
m_nrm += unpack_texture_normal(texture(p3d_Texture6, detail_coord).xyz) * layers.y;
m_nrm += unpack_texture_normal(texture(p3d_Texture10, detail_coord).xyz) * layers.z;
m_nrm += unpack_texture_normal(texture(p3d_Texture14, detail_coord).xyz) * layers.w;
// Specular
float spec = 0.0;
spec = texture(p3d_Texture3, detail_coord).x * layers.x;
spec += texture(p3d_Texture7, detail_coord).x * layers.y;
spec += texture(p3d_Texture11, detail_coord).x * layers.z;
spec += texture(p3d_Texture15, detail_coord).x * layers.w;
// Material properties
m.shading_model = mInput.shading_model;
m.basecolor = m_base * mInput.color;
m.normal = apply_normal_map(vOutput.normal, m_nrm, mInput.normalfactor);
m.specular_ior = blend_ior(mInput.specular_ior, spec);
m.roughness = mInput.roughness;
m.metallic = mInput.metallic;
m.shading_model_param0 = mInput.arbitrary0;