Files
cup_edit/macos/include/gltfio/sheen.mat
2023-09-05 23:13:59 +08:00

142 lines
5.3 KiB
Plaintext

material {
name : sheen_ubershader,
requires : [ uv0, uv1, color ],
shadingModel : lit,
blending : opaque,
depthWrite : true,
doubleSided : false,
transparency : default,
flipUV : false,
specularAmbientOcclusion : simple,
specularAntiAliasing : true,
reflections : screenspace,
parameters : [
// Base Color
{ type : int, name : baseColorIndex },
{ type : float4, name : baseColorFactor },
{ type : sampler2d, name : baseColorMap },
{ type : mat3, name : baseColorUvMatrix, precision: high },
// Metallic-Roughness Map
{ type : int, name : metallicRoughnessIndex },
{ type : float, name : metallicFactor },
{ type : float, name : roughnessFactor },
{ type : sampler2d, name : metallicRoughnessMap },
{ type : mat3, name : metallicRoughnessUvMatrix, precision: high },
// Normal Map
{ type : int, name : normalIndex },
{ type : float, name : normalScale },
{ type : sampler2d, name : normalMap },
{ type : mat3, name : normalUvMatrix, precision: high },
// Ambient Occlusion
{ type : int, name : aoIndex },
{ type : float, name : aoStrength },
{ type : sampler2d, name : occlusionMap },
{ type : mat3, name : occlusionUvMatrix, precision: high },
// Emissive Map
{ type : int, name : emissiveIndex },
{ type : float3, name : emissiveFactor },
{ type : float, name : emissiveStrength },
{ type : sampler2d, name : emissiveMap },
{ type : mat3, name : emissiveUvMatrix, precision: high },
// Sheen Map
{ type : int, name : sheenColorIndex },
{ type : float3, name : sheenColorFactor },
{ type : sampler2d, name : sheenColorMap },
{ type : mat3, name : sheenColorUvMatrix, precision: high },
{ type : int, name : sheenRoughnessIndex },
{ type : float, name : sheenRoughnessFactor },
{ type : sampler2d, name : sheenRoughnessMap },
{ type : mat3, name : sheenRoughnessUvMatrix, precision: high },
// Reflectance
{ type : float, name : reflectance }
${CUSTOM_PARAMS}
],
}
vertex {
void materialVertex(inout MaterialVertexInputs material) {
${CUSTOM_VERTEX}
}
}
fragment {
void material(inout MaterialInputs material) {
highp float2 uvs[2];
uvs[0] = getUV0();
uvs[1] = getUV1();
if (materialParams.normalIndex > -1) {
highp float2 uv = uvs[materialParams.normalIndex];
uv = (vec3(uv, 1.0) * materialParams.normalUvMatrix).xy;
material.normal = texture(materialParams_normalMap, uv).xyz * 2.0 - 1.0;
material.normal.xy *= materialParams.normalScale;
}
prepareMaterial(material);
material.baseColor = materialParams.baseColorFactor;
if (materialParams.baseColorIndex > -1) {
highp float2 uv = uvs[materialParams.baseColorIndex];
uv = (vec3(uv, 1.0) * materialParams.baseColorUvMatrix).xy;
material.baseColor *= texture(materialParams_baseColorMap, uv);
}
#if defined(BLEND_MODE_TRANSPARENT)
material.baseColor.rgb *= material.baseColor.a;
#endif
material.baseColor *= getColor();
material.roughness = materialParams.roughnessFactor;
material.metallic = materialParams.metallicFactor;
material.sheenColor = materialParams.sheenColorFactor;
material.sheenRoughness = materialParams.sheenRoughnessFactor;
material.reflectance = materialParams.reflectance;
material.emissive = vec4(materialParams.emissiveStrength *
materialParams.emissiveFactor.rgb, 0.0);
if (materialParams.sheenColorIndex > -1) {
highp float2 uv = uvs[materialParams.sheenColorIndex];
uv = (vec3(uv, 1.0) * materialParams.sheenColorUvMatrix).xy;
material.sheenColor *= texture(materialParams_sheenColorMap, uv).rgb;
}
if (materialParams.sheenRoughnessIndex > -1) {
highp float2 uv = uvs[materialParams.sheenRoughnessIndex];
uv = (vec3(uv, 1.0) * materialParams.sheenRoughnessUvMatrix).xy;
material.sheenRoughness *= texture(materialParams_sheenRoughnessMap, uv).a;
}
if (materialParams.metallicRoughnessIndex > -1) {
highp float2 uv = uvs[materialParams.metallicRoughnessIndex];
uv = (vec3(uv, 1.0) * materialParams.metallicRoughnessUvMatrix).xy;
vec4 mr = texture(materialParams_metallicRoughnessMap, uv);
material.roughness *= mr.g;
material.metallic *= mr.b;
}
if (materialParams.aoIndex > -1) {
highp float2 uv = uvs[materialParams.aoIndex];
uv = (vec3(uv, 1.0) * materialParams.occlusionUvMatrix).xy;
float occlusion = texture(materialParams_occlusionMap, uv).r;
material.ambientOcclusion = 1.0 + materialParams.aoStrength * (occlusion - 1.0);
}
if (materialParams.emissiveIndex > -1) {
highp float2 uv = uvs[materialParams.emissiveIndex];
uv = (vec3(uv, 1.0) * materialParams.emissiveUvMatrix).xy;
material.emissive.rgb *= texture(materialParams_emissiveMap, uv).rgb;
}
${CUSTOM_FRAGMENT}
}
}