<@include gpu/Config.slh@><$VERSION_HEADER$>// <$_SCRIBE_FILENAME$>// Generated on <$_SCRIBE_DATE$>//// Created by Andrzej Kapolka on 5/6/14.// Copyright 2014 High Fidelity, Inc.// Copyright 2024 Overte e.V.//// Distributed under the Apache License, Version 2.0.// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html// <@include graphics/Material.slh@><@include graphics/MaterialTextures.slh@><@include render-utils/ShaderConstants.h@><@include CullFace.slh@> <@if HIFI_USE_MTOON@> <@if HIFI_USE_SHADOW@> <$declareMToonMaterialTextures(ALBEDO)$> <@if HIFI_USE_MIRROR@> TEXTURE(GRAPHICS_TEXTURE_MATERIAL_MIRROR, sampler2D, mirrorMap); <@endif@> <@else@> <@if HIFI_USE_NORMALMAP@> <$declareMToonMaterialTextures(ALBEDO, NORMAL, SHADE, EMISSIVE, SHADING_SHIFT, MATCAP, RIM, UV_ANIMATION_MASK)$> <@else@> <$declareMToonMaterialTextures(ALBEDO, _SCRIBE_NULL, SHADE, EMISSIVE, SHADING_SHIFT, MATCAP, RIM, UV_ANIMATION_MASK)$> <@endif@> <@endif@><@else@> <@if HIFI_USE_SHADOW or HIFI_USE_UNLIT@> <$declareMaterialTextures(ALBEDO)$> <@if HIFI_USE_MIRROR@> TEXTURE(GRAPHICS_TEXTURE_MATERIAL_MIRROR, sampler2D, mirrorMap); <@endif@> <@else@> <@if not HIFI_USE_LIGHTMAP@> <@if HIFI_USE_TRANSLUCENT@> <@if HIFI_USE_NORMALMAP@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, NORMAL, METALLIC, EMISSIVE, OCCLUSION)$> <@else@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, _SCRIBE_NULL, METALLIC, EMISSIVE, OCCLUSION)$> <@endif@> <@else@> <@if HIFI_USE_NORMALMAP@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, NORMAL, METALLIC, EMISSIVE, OCCLUSION, SCATTERING)$> <@else@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, _SCRIBE_NULL, METALLIC, EMISSIVE, OCCLUSION, SCATTERING)$> <@endif@> <@endif@> <@else@> <@if HIFI_USE_NORMALMAP@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, NORMAL, METALLIC)$> <@else@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, _SCRIBE_NULL, METALLIC)$> <@endif@> <$declareMaterialLightmap()$> <@endif@> <@endif@><@endif@> <@if HIFI_USE_TRIPLANAR@> struct TriplanarParams { vec4 scale; }; UNIFORM_BUFFER(GRAPHICS_BUFFER_TRIPLANAR_SCALE, triplanarParamsBuffer) { TriplanarParams triplanarParams; };<@endif@> <@if HIFI_USE_SPLATMAP@> <$declareMaterialSplatMap()$><@endif@> <@if not HIFI_USE_SHADOW@> <@if HIFI_USE_MTOON@> <@include DefaultMaterials.slh@> <@include GlobalLight.slh@> <@if HIFI_USE_FORWARD or HIFI_USE_TRANSLUCENT@> <$declareEvalGlobalLightingAlphaBlendedMToon(1)$> <@else@> <$declareEvalGlobalLightingAlphaBlendedMToon(_SCRIBE_NULL)$> <@endif@> <@include gpu/Transform.slh@> <$declareStandardCameraTransform()$> <@if HIFI_USE_FORWARD@> <@include LightLocal.slh@> <@endif@> <@elif HIFI_USE_FORWARD or HIFI_USE_TRANSLUCENT@> <@include DefaultMaterials.slh@> <@include GlobalLight.slh@> <@if HIFI_USE_LIGHTMAP@> <$declareEvalLightmappedColor()$> <@else@> <@include LightLocal.slh@> <$declareEvalGlobalLightingAlphaBlended()$> <@endif@> <@include gpu/Transform.slh@> <$declareStandardCameraTransform()$> <@endif@> <@if HIFI_USE_FORWARD@> OUTPUT(0, vec4, _fragColor0); <@else@> <@include DeferredBufferWrite.slh@> <@endif@><@else@> <@if HIFI_USE_MIRROR@> <@if HIFI_USE_FORWARD@> OUTPUT(0, vec4, _fragColor0); <@else@> <@include DeferredBufferWrite.slh@> <@endif@> <@else@> OUTPUT(0, vec4, _fragColor0); <@endif@><@endif@> <@include LightingModel.slh@> <@if HIFI_USE_FADE@> <@include Fade.slh@> <$declareFadeFragment()$><@endif@> <@if HIFI_USE_NORMALMAP and HIFI_USE_TRIPLANAR@> <@include gpu/Transform.slh@> <$declareStandardObjectTransform()$><@endif@> INPUT(RENDER_UTILS_ATTR_POSITION_WS, vec4, _positionWS);INPUT(RENDER_UTILS_ATTR_TEXCOORD01, vec4, _texCoord01[NUM_LAYERS]);#define _texCoords mat2[NUM_LAYERS]( \ mat2(_texCoord01[0].xy, _texCoord01[0].zw) \<@if HIFI_USE_LAYERS2 or HIFI_USE_LAYERS3@> , mat2(_texCoord01[1].xy, _texCoord01[1].zw) \<@endif@><@if HIFI_USE_LAYERS3@> , mat2(_texCoord01[2].xy, _texCoord01[2].zw) \<@endif@>) <@if not HIFI_USE_SHADOW@> INPUT(RENDER_UTILS_ATTR_POSITION_ES, vec4, _positionES); INPUT(RENDER_UTILS_ATTR_NORMAL_WS, vec3, _normalWS); <@if not HIFI_USE_MTOON@> INPUT(RENDER_UTILS_ATTR_COLOR, vec4, _color); <@endif@> INPUT(RENDER_UTILS_ATTR_PREV_POSITION_CS, vec4, _prevPositionCS); <@if not HIFI_USE_TRIPLANAR@> <@if HIFI_USE_NORMALMAP@> INPUT(RENDER_UTILS_ATTR_TANGENT_WS, vec3, _tangentWS); <@endif@> <@endif@><@endif@><@if HIFI_USE_TRIPLANAR@> INPUT(RENDER_UTILS_ATTR_POSITION_MS, vec3, _positionMS); INPUT(RENDER_UTILS_ATTR_NORMAL_MS, vec3, _normalMS);<@endif@> void main(void) {<@if HIFI_USE_FADE@> <@if not HIFI_USE_SHADOW@> vec3 fadeEmissive; FadeObjectParams fadeParams; <$fetchFadeObjectParams(fadeParams)$> applyFade(fadeParams, _positionWS.xyz, fadeEmissive); <@else@> FadeObjectParams fadeParams; <$fetchFadeObjectParams(fadeParams)$> applyFadeClip(fadeParams, _positionWS.xyz); <@endif@><@endif@> <@if not HIFI_USE_SHADOW@> vec3 normalWS = normalize(_normalWS);<@endif@> Material mats[NUM_LAYERS]; BITFIELD matKeys[NUM_LAYERS]; for (int layer = 0; layer < NUM_LAYERS; layer++) { Material mat = getMaterial(layer); mats[layer] = mat; matKeys[layer] = getMaterialKey(mat); }<@if HIFI_USE_SHADOW or HIFI_USE_UNLIT@> <@if not HIFI_USE_SHADOW@> vec3 albedo = vec3(0.0); <@endif@> float opacity = 0.0; <@if not HIFI_USE_TRIPLANAR@> <@if HIFI_USE_SPLATMAP@> vec3 layerBlend = fetchSplatMap(0, _texCoords[0]); // splatMap is only stored in the first material <@endif@> for (int layer = NUM_LAYERS - 1; layer >= 0; layer--) { <@if not HIFI_USE_MTOON@> <$fetchMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex)$> <@else@> <$fetchMToonMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex)$> <@endif@> <@else@> vec3 triplanarScale = triplanarParams.scale.xyz; <@if not HIFI_USE_MTOON@> <$fetchMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, _SCRIBE_NULL, _texCoord01, triplanarScale, albedoTex)$> <@else@> <$fetchMToonMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, _SCRIBE_NULL, _texCoord01, triplanarScale, albedoTex)$> <@endif@> float opacityCutoffTex = 1.0; <@if HIFI_USE_LAYERS3@> const int layerIndices[3] = int[3](0, 1, 2); <@elif HIFI_USE_LAYERS2@> const int layerIndices[3] = int[3](1, 0, 1); <@else@> const int layerIndices[3] = int[3](0, 0, 0); <@endif@> for (int i = 0; i < 3; i++) { int layer = layerIndices[i]; <@endif@> <@if not HIFI_USE_SHADOW@> vec3 albedoLayer = getMaterialAlbedo(mats[layer]); <$evalMaterialAlbedo(albedoTex, albedoLayer, matKeys[layer], albedoLayer)$> <@endif@> float cutoff = getMaterialOpacityCutoff(mats[layer]); <@if HIFI_USE_TRANSLUCENT@> float opacityLayer = getMaterialOpacity(mats[layer]); <$evalMaterialOpacity(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@else@> float opacityLayer = 1.0; <$evalMaterialOpacityMask(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@endif@> opacityLayer *= opacityCutoffTex; <@if HIFI_USE_TRIPLANAR or HIFI_USE_SPLATMAP@> <@if HIFI_USE_TRIPLANAR@> float magnitude = layerBlend[i]; <@else@> float magnitude = layerBlend[layer]; <@endif@> <@if not HIFI_USE_SHADOW@> albedo += albedoLayer * magnitude; <@endif@> opacity += opacityLayer * magnitude; <@else@> if (layer == NUM_LAYERS - 1) { <@if not HIFI_USE_SHADOW@> albedo = albedoLayer; <@endif@> opacity = opacityLayer; } else { <@if not HIFI_USE_SHADOW@> albedo = mix(albedo, albedoLayer, opacityLayer); <@endif@> <$evalLayeredOpacity(opacity, opacityLayer, opacity)$> } <@endif@> } <@if HIFI_USE_TRANSLUCENT@> <@if not HIFI_USE_MTOON@> opacity *= _color.a; <@endif@> <$discardInvisible(opacity)$> <@else@> <$discardTransparent(opacity)$> <@endif@> <@if not HIFI_USE_SHADOW@> <@if not HIFI_USE_MTOON@> albedo *= _color.rgb; <@endif@> <@if HIFI_USE_FADE@> albedo += fadeEmissive; <@endif@> <@endif@> <@if HIFI_USE_MIRROR@> vec3 mirrorColor = texelFetch(mirrorMap, ivec2(gl_FragCoord.xy), 0).rgb; <@if HIFI_USE_FORWARD@> _fragColor0 = vec4(mirrorColor, 1.0); <@else@> // Mirrors have AA disabled packDeferredFragmentUnlit(vec4(0.0, 0.0, 0.0, 1.0), vec3(1.0, 0.0, 0.0), 1.0, mirrorColor); <@endif@> <@elif HIFI_USE_SHADOW@> _fragColor0 = vec4(1.0); <@elif HIFI_USE_FORWARD@> _fragColor0 = vec4(albedo * isUnlitEnabled(), opacity); <@elif HIFI_USE_TRANSLUCENT@> packDeferredFragmentTranslucentUnlit( opacity, albedo * isUnlitEnabled()); <@else@> packDeferredFragmentUnlit( _prevPositionCS, evalFrontOrBackFaceNormal(normalWS), opacity, albedo * isUnlitEnabled()); <@endif@><@elif HIFI_USE_MTOON@> float time = getMaterialTime(mats[0]); // time is only stored in the first material vec3 albedo = vec3(0.0); float opacity = 0.0; vec3 emissive = vec3(0.0); vec3 fragNormalWS = vec3(0.0); vec3 shade = vec3(0.0); float shadingShift = 0.0; float shadingToony = 0.0; vec3 matcap = vec3(0.0); vec3 parametricRim = vec3(0.0); float parametricRimFresnelPower = 0.0; float parametricRimLift = 0.0; vec3 rimTex = vec3(0.0); float rimLightingMix = 0.0; <@if not HIFI_USE_TRIPLANAR@> <@if HIFI_USE_SPLATMAP@> vec3 layerBlend = fetchSplatMap(0, _texCoords[0]); // splatMap is only stored in the first material <@endif@> for (int layer = NUM_LAYERS - 1; layer >= 0; layer--) { vec3 uvScrollSpeed = getMaterialUVScrollSpeed(mats[layer]); <@if HIFI_USE_NORMALMAP@> <$fetchMToonMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex, normalTex, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@else@> <$fetchMToonMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex, _SCRIBE_NULL, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@endif@> <@else@> vec3 triplanarScale = triplanarParams.scale.xyz; vec3 uvScrollSpeed = getMaterialUVScrollSpeed(mats[0]); <@if HIFI_USE_NORMALMAP@> <$fetchMToonMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, normalWS, _texCoord01, triplanarScale, albedoTex, normalTex, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@else@> <$fetchMToonMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, _SCRIBE_NULL, _texCoord01, triplanarScale, albedoTex, _SCRIBE_NULL, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@endif@> float opacityCutoffTex = 1.0; <@if HIFI_USE_LAYERS3@> const int layerIndices[3] = int[3](0, 1, 2); <@elif HIFI_USE_LAYERS2@> const int layerIndices[3] = int[3](1, 0, 1); <@else@> const int layerIndices[3] = int[3](0, 0, 0); <@endif@> for (int i = 0; i < 3; i++) { int layer = layerIndices[i]; <@endif@> vec3 albedoLayer = getMaterialAlbedo(mats[layer]); <$evalMaterialAlbedo(albedoTex, albedoLayer, matKeys[layer], albedoLayer)$> float cutoff = getMaterialOpacityCutoff(mats[layer]); <@if HIFI_USE_TRANSLUCENT@> float opacityLayer = getMaterialOpacity(mats[layer]); <$evalMaterialOpacity(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@else@> float opacityLayer = 1.0; <$evalMaterialOpacityMask(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@endif@> opacityLayer *= opacityCutoffTex; vec3 emissiveLayer = getMaterialEmissive(mats[layer]); <$evalMaterialEmissive(emissiveTex, emissiveLayer, matKeys[layer], emissiveLayer)$> <@if HIFI_USE_NORMALMAP@> vec3 fragNormalWSLayer; <@if not HIFI_USE_TRIPLANAR@> <$evalMaterialNormalLOD(_positionES, normalTex, normalWS, _tangentWS, fragNormalWSLayer)$> <@else@> <$evalMaterialNormalLODTriplanar(_positionES, normalTex, normalWS, fragNormalWSLayer)$> <@endif@> <@else@> vec3 fragNormalWSLayer = normalWS; <@endif@> fragNormalWSLayer = evalFrontOrBackFaceNormal(fragNormalWSLayer); vec3 shadeLayer = getMaterialShade(mats[layer]); <$evalMaterialShade(shadeTex, shadeLayer, matKeys[layer], shadeLayer)$> float shadingShiftLayer = getMaterialShadingShift(mats[layer]); <$evalMaterialShadingShift(shadingShiftTex, shadingShiftLayer, matKeys[layer], shadingShiftLayer)$> float shadingToonyLayer = getMaterialShadingToony(mats[layer]); vec3 matcapLayer = getMaterialMatcap(mats[layer]); vec3 parametricRimLayer = getMaterialParametricRim(mats[layer]); float parametricRimFresnelPowerLayer = getMaterialParametricRimFresnelPower(mats[layer]); float parametricRimLiftLayer = getMaterialParametricRimLift(mats[layer]); float rimLightingMixLayer = getMaterialRimLightingMix(mats[layer]); <@if HIFI_USE_TRIPLANAR or HIFI_USE_SPLATMAP@> <@if HIFI_USE_TRIPLANAR@> float magnitude = layerBlend[i]; <@else@> float magnitude = layerBlend[layer]; <@endif@> albedo += albedoLayer * magnitude; opacity += opacityLayer * magnitude; emissive += emissiveLayer * magnitude; fragNormalWS += fragNormalWSLayer * magnitude; shade += shadeLayer * magnitude; shadingShift += shadingShiftLayer * magnitude; shadingToony += shadingToonyLayer * magnitude; parametricRim += parametricRimLayer * magnitude; parametricRimFresnelPower += parametricRimFresnelPowerLayer * magnitude; parametricRimLift += parametricRimLiftLayer * magnitude; rimTex += rimTexLayer * magnitude; rimLightingMix += rimLightingMixLayer * magnitude; <@else@> if (layer == NUM_LAYERS - 1) { albedo = albedoLayer; opacity = opacityLayer; emissive = emissiveLayer; fragNormalWS = fragNormalWSLayer; shade = shadeLayer; shadingShift = shadingShiftLayer; shadingToony = shadingToonyLayer; parametricRim = parametricRimLayer; parametricRimFresnelPower = parametricRimFresnelPowerLayer; parametricRimLift = parametricRimLiftLayer; rimTex = rimTexLayer; rimLightingMix = rimLightingMixLayer; } else { albedo = mix(albedo, albedoLayer, opacityLayer); <$evalLayeredOpacity(opacity, opacityLayer, opacity)$> emissive = mix(emissive, emissiveLayer, opacityLayer); fragNormalWS = mix(fragNormalWS, fragNormalWSLayer, opacityLayer); shade = mix(shade, shadeLayer, opacityLayer); shadingShift = mix(shadingShift, shadingShiftLayer, opacityLayer); shadingToony = mix(shadingToony, shadingToonyLayer, opacityLayer); parametricRim = mix(parametricRim, parametricRimLayer, opacityLayer); parametricRimFresnelPower = mix(parametricRimFresnelPower, parametricRimFresnelPowerLayer, opacityLayer); parametricRimLift = mix(parametricRimLift, parametricRimLiftLayer, opacityLayer); rimTex = mix(rimTex, rimTexLayer, opacityLayer); rimLightingMix = mix(rimLightingMix, rimLightingMixLayer, opacityLayer); } <@endif@> } fragNormalWS = normalize(fragNormalWS); <@if HIFI_USE_TRANSLUCENT@> <$discardInvisible(opacity)$> <@else@> <$discardTransparent(opacity)$> <@endif@> TransformCamera cam = getTransformCamera(); float metallic = DEFAULT_METALLIC; vec3 fresnel = getFresnelF0(metallic, albedo); vec4 color = vec4(evalGlobalLightingAlphaBlendedMToon( cam._viewInverse, 1.0, _positionES.xyz, fragNormalWS, albedo, fresnel, metallic, emissive, DEFAULT_ROUGHNESS, opacity, shade, shadingShift, shadingToony, matcap, parametricRim, parametricRimFresnelPower, parametricRimLift, rimTex, rimLightingMix, matKeys[0]), opacity); <@if HIFI_USE_FORWARD@> vec3 fragPositionWS = _positionWS.xyz; vec3 fragToEyeWS = cam._viewInverse[3].xyz - fragPositionWS; vec3 fragToEyeDirWS = normalize(fragToEyeWS); SurfaceData surfaceWS = initSurfaceData(DEFAULT_ROUGHNESS, fragNormalWS, fragToEyeDirWS); vec4 localLighting = vec4(0.0); <$fetchClusterInfo(_positionWS)$> if (hasLocalLights(numLights, clusterPos, dims)) { localLighting = evalLocalLighting(cluster, numLights, fragPositionWS, surfaceWS, metallic, fresnel, albedo, 0.0, vec4(0), vec4(0), opacity); } color.rgb += localLighting.rgb; _fragColor0 = isUnlitEnabled() * vec4(color.rgb <@if HIFI_USE_FADE@> + fadeEmissive <@endif@> , color.a); <@elif HIFI_USE_TRANSLUCENT@> packDeferredFragmentTranslucentUnlit( color.a, color.rgb <@if HIFI_USE_FADE@> + fadeEmissive <@endif@> ); <@else@> packDeferredFragmentUnlit( _prevPositionCS, fragNormalWS, 1.0, color.rgbLines 1–500 of 810. Load more
<@include gpu/Config.slh@> <$VERSION_HEADER$> // <$_SCRIBE_FILENAME$> // Generated on <$_SCRIBE_DATE$> // // Created by Andrzej Kapolka on 5/6/14. // Copyright 2014 High Fidelity, Inc. // Copyright 2024 Overte e.V. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // <@include graphics/Material.slh@> <@include graphics/MaterialTextures.slh@> <@include render-utils/ShaderConstants.h@> <@include CullFace.slh@> <@if HIFI_USE_MTOON@> <@if HIFI_USE_SHADOW@> <$declareMToonMaterialTextures(ALBEDO)$> <@if HIFI_USE_MIRROR@> TEXTURE(GRAPHICS_TEXTURE_MATERIAL_MIRROR, sampler2D, mirrorMap); <@endif@> <@else@> <@if HIFI_USE_NORMALMAP@> <$declareMToonMaterialTextures(ALBEDO, NORMAL, SHADE, EMISSIVE, SHADING_SHIFT, MATCAP, RIM, UV_ANIMATION_MASK)$> <@else@> <$declareMToonMaterialTextures(ALBEDO, _SCRIBE_NULL, SHADE, EMISSIVE, SHADING_SHIFT, MATCAP, RIM, UV_ANIMATION_MASK)$> <@endif@> <@endif@> <@else@> <@if HIFI_USE_SHADOW or HIFI_USE_UNLIT@> <$declareMaterialTextures(ALBEDO)$> <@if HIFI_USE_MIRROR@> TEXTURE(GRAPHICS_TEXTURE_MATERIAL_MIRROR, sampler2D, mirrorMap); <@endif@> <@else@> <@if not HIFI_USE_LIGHTMAP@> <@if HIFI_USE_TRANSLUCENT@> <@if HIFI_USE_NORMALMAP@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, NORMAL, METALLIC, EMISSIVE, OCCLUSION)$> <@else@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, _SCRIBE_NULL, METALLIC, EMISSIVE, OCCLUSION)$> <@endif@> <@else@> <@if HIFI_USE_NORMALMAP@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, NORMAL, METALLIC, EMISSIVE, OCCLUSION, SCATTERING)$> <@else@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, _SCRIBE_NULL, METALLIC, EMISSIVE, OCCLUSION, SCATTERING)$> <@endif@> <@endif@> <@else@> <@if HIFI_USE_NORMALMAP@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, NORMAL, METALLIC)$> <@else@> <$declareMaterialTextures(ALBEDO, ROUGHNESS, _SCRIBE_NULL, METALLIC)$> <@endif@> <$declareMaterialLightmap()$> <@endif@> <@endif@> <@endif@> <@if HIFI_USE_TRIPLANAR@> struct TriplanarParams { vec4 scale; }; UNIFORM_BUFFER(GRAPHICS_BUFFER_TRIPLANAR_SCALE, triplanarParamsBuffer) { TriplanarParams triplanarParams; }; <@endif@> <@if HIFI_USE_SPLATMAP@> <$declareMaterialSplatMap()$> <@endif@> <@if not HIFI_USE_SHADOW@> <@if HIFI_USE_MTOON@> <@include DefaultMaterials.slh@> <@include GlobalLight.slh@> <@if HIFI_USE_FORWARD or HIFI_USE_TRANSLUCENT@> <$declareEvalGlobalLightingAlphaBlendedMToon(1)$> <@else@> <$declareEvalGlobalLightingAlphaBlendedMToon(_SCRIBE_NULL)$> <@endif@> <@include gpu/Transform.slh@> <$declareStandardCameraTransform()$> <@if HIFI_USE_FORWARD@> <@include LightLocal.slh@> <@endif@> <@elif HIFI_USE_FORWARD or HIFI_USE_TRANSLUCENT@> <@include DefaultMaterials.slh@> <@include GlobalLight.slh@> <@if HIFI_USE_LIGHTMAP@> <$declareEvalLightmappedColor()$> <@else@> <@include LightLocal.slh@> <$declareEvalGlobalLightingAlphaBlended()$> <@endif@> <@include gpu/Transform.slh@> <$declareStandardCameraTransform()$> <@endif@> <@if HIFI_USE_FORWARD@> OUTPUT(0, vec4, _fragColor0); <@else@> <@include DeferredBufferWrite.slh@> <@endif@> <@else@> <@if HIFI_USE_MIRROR@> <@if HIFI_USE_FORWARD@> OUTPUT(0, vec4, _fragColor0); <@else@> <@include DeferredBufferWrite.slh@> <@endif@> <@else@> OUTPUT(0, vec4, _fragColor0); <@endif@> <@endif@> <@include LightingModel.slh@> <@if HIFI_USE_FADE@> <@include Fade.slh@> <$declareFadeFragment()$> <@endif@> <@if HIFI_USE_NORMALMAP and HIFI_USE_TRIPLANAR@> <@include gpu/Transform.slh@> <$declareStandardObjectTransform()$> <@endif@> INPUT(RENDER_UTILS_ATTR_POSITION_WS, vec4, _positionWS); INPUT(RENDER_UTILS_ATTR_TEXCOORD01, vec4, _texCoord01[NUM_LAYERS]); #define _texCoords mat2[NUM_LAYERS]( \ mat2(_texCoord01[0].xy, _texCoord01[0].zw) \ <@if HIFI_USE_LAYERS2 or HIFI_USE_LAYERS3@> , mat2(_texCoord01[1].xy, _texCoord01[1].zw) \ <@endif@> <@if HIFI_USE_LAYERS3@> , mat2(_texCoord01[2].xy, _texCoord01[2].zw) \ <@endif@> ) <@if not HIFI_USE_SHADOW@> INPUT(RENDER_UTILS_ATTR_POSITION_ES, vec4, _positionES); INPUT(RENDER_UTILS_ATTR_NORMAL_WS, vec3, _normalWS); <@if not HIFI_USE_MTOON@> INPUT(RENDER_UTILS_ATTR_COLOR, vec4, _color); <@endif@> INPUT(RENDER_UTILS_ATTR_PREV_POSITION_CS, vec4, _prevPositionCS); <@if not HIFI_USE_TRIPLANAR@> <@if HIFI_USE_NORMALMAP@> INPUT(RENDER_UTILS_ATTR_TANGENT_WS, vec3, _tangentWS); <@endif@> <@endif@> <@endif@> <@if HIFI_USE_TRIPLANAR@> INPUT(RENDER_UTILS_ATTR_POSITION_MS, vec3, _positionMS); INPUT(RENDER_UTILS_ATTR_NORMAL_MS, vec3, _normalMS); <@endif@> void main(void) { <@if HIFI_USE_FADE@> <@if not HIFI_USE_SHADOW@> vec3 fadeEmissive; FadeObjectParams fadeParams; <$fetchFadeObjectParams(fadeParams)$> applyFade(fadeParams, _positionWS.xyz, fadeEmissive); <@else@> FadeObjectParams fadeParams; <$fetchFadeObjectParams(fadeParams)$> applyFadeClip(fadeParams, _positionWS.xyz); <@endif@> <@endif@> <@if not HIFI_USE_SHADOW@> vec3 normalWS = normalize(_normalWS); <@endif@> Material mats[NUM_LAYERS]; BITFIELD matKeys[NUM_LAYERS]; for (int layer = 0; layer < NUM_LAYERS; layer++) { Material mat = getMaterial(layer); mats[layer] = mat; matKeys[layer] = getMaterialKey(mat); } <@if HIFI_USE_SHADOW or HIFI_USE_UNLIT@> <@if not HIFI_USE_SHADOW@> vec3 albedo = vec3(0.0); <@endif@> float opacity = 0.0; <@if not HIFI_USE_TRIPLANAR@> <@if HIFI_USE_SPLATMAP@> vec3 layerBlend = fetchSplatMap(0, _texCoords[0]); // splatMap is only stored in the first material <@endif@> for (int layer = NUM_LAYERS - 1; layer >= 0; layer--) { <@if not HIFI_USE_MTOON@> <$fetchMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex)$> <@else@> <$fetchMToonMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex)$> <@endif@> <@else@> vec3 triplanarScale = triplanarParams.scale.xyz; <@if not HIFI_USE_MTOON@> <$fetchMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, _SCRIBE_NULL, _texCoord01, triplanarScale, albedoTex)$> <@else@> <$fetchMToonMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, _SCRIBE_NULL, _texCoord01, triplanarScale, albedoTex)$> <@endif@> float opacityCutoffTex = 1.0; <@if HIFI_USE_LAYERS3@> const int layerIndices[3] = int[3](0, 1, 2); <@elif HIFI_USE_LAYERS2@> const int layerIndices[3] = int[3](1, 0, 1); <@else@> const int layerIndices[3] = int[3](0, 0, 0); <@endif@> for (int i = 0; i < 3; i++) { int layer = layerIndices[i]; <@endif@> <@if not HIFI_USE_SHADOW@> vec3 albedoLayer = getMaterialAlbedo(mats[layer]); <$evalMaterialAlbedo(albedoTex, albedoLayer, matKeys[layer], albedoLayer)$> <@endif@> float cutoff = getMaterialOpacityCutoff(mats[layer]); <@if HIFI_USE_TRANSLUCENT@> float opacityLayer = getMaterialOpacity(mats[layer]); <$evalMaterialOpacity(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@else@> float opacityLayer = 1.0; <$evalMaterialOpacityMask(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@endif@> opacityLayer *= opacityCutoffTex; <@if HIFI_USE_TRIPLANAR or HIFI_USE_SPLATMAP@> <@if HIFI_USE_TRIPLANAR@> float magnitude = layerBlend[i]; <@else@> float magnitude = layerBlend[layer]; <@endif@> <@if not HIFI_USE_SHADOW@> albedo += albedoLayer * magnitude; <@endif@> opacity += opacityLayer * magnitude; <@else@> if (layer == NUM_LAYERS - 1) { <@if not HIFI_USE_SHADOW@> albedo = albedoLayer; <@endif@> opacity = opacityLayer; } else { <@if not HIFI_USE_SHADOW@> albedo = mix(albedo, albedoLayer, opacityLayer); <@endif@> <$evalLayeredOpacity(opacity, opacityLayer, opacity)$> } <@endif@> } <@if HIFI_USE_TRANSLUCENT@> <@if not HIFI_USE_MTOON@> opacity *= _color.a; <@endif@> <$discardInvisible(opacity)$> <@else@> <$discardTransparent(opacity)$> <@endif@> <@if not HIFI_USE_SHADOW@> <@if not HIFI_USE_MTOON@> albedo *= _color.rgb; <@endif@> <@if HIFI_USE_FADE@> albedo += fadeEmissive; <@endif@> <@endif@> <@if HIFI_USE_MIRROR@> vec3 mirrorColor = texelFetch(mirrorMap, ivec2(gl_FragCoord.xy), 0).rgb; <@if HIFI_USE_FORWARD@> _fragColor0 = vec4(mirrorColor, 1.0); <@else@> // Mirrors have AA disabled packDeferredFragmentUnlit(vec4(0.0, 0.0, 0.0, 1.0), vec3(1.0, 0.0, 0.0), 1.0, mirrorColor); <@endif@> <@elif HIFI_USE_SHADOW@> _fragColor0 = vec4(1.0); <@elif HIFI_USE_FORWARD@> _fragColor0 = vec4(albedo * isUnlitEnabled(), opacity); <@elif HIFI_USE_TRANSLUCENT@> packDeferredFragmentTranslucentUnlit( opacity, albedo * isUnlitEnabled()); <@else@> packDeferredFragmentUnlit( _prevPositionCS, evalFrontOrBackFaceNormal(normalWS), opacity, albedo * isUnlitEnabled()); <@endif@> <@elif HIFI_USE_MTOON@> float time = getMaterialTime(mats[0]); // time is only stored in the first material vec3 albedo = vec3(0.0); float opacity = 0.0; vec3 emissive = vec3(0.0); vec3 fragNormalWS = vec3(0.0); vec3 shade = vec3(0.0); float shadingShift = 0.0; float shadingToony = 0.0; vec3 matcap = vec3(0.0); vec3 parametricRim = vec3(0.0); float parametricRimFresnelPower = 0.0; float parametricRimLift = 0.0; vec3 rimTex = vec3(0.0); float rimLightingMix = 0.0; <@if not HIFI_USE_TRIPLANAR@> <@if HIFI_USE_SPLATMAP@> vec3 layerBlend = fetchSplatMap(0, _texCoords[0]); // splatMap is only stored in the first material <@endif@> for (int layer = NUM_LAYERS - 1; layer >= 0; layer--) { vec3 uvScrollSpeed = getMaterialUVScrollSpeed(mats[layer]); <@if HIFI_USE_NORMALMAP@> <$fetchMToonMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex, normalTex, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@else@> <$fetchMToonMaterialTextures(layer, matKeys[layer], _texCoords[layer], albedoTex, opacityCutoffTex, _SCRIBE_NULL, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@endif@> <@else@> vec3 triplanarScale = triplanarParams.scale.xyz; vec3 uvScrollSpeed = getMaterialUVScrollSpeed(mats[0]); <@if HIFI_USE_NORMALMAP@> <$fetchMToonMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, normalWS, _texCoord01, triplanarScale, albedoTex, normalTex, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@else@> <$fetchMToonMaterialTexturesTriplanar(layerBlend, matKeys, _positionMS, _normalMS, _SCRIBE_NULL, _texCoord01, triplanarScale, albedoTex, _SCRIBE_NULL, shadeTex, emissiveTex, shadingShiftTex, rimTexLayer, uvScrollSpeed, time)$> <@endif@> float opacityCutoffTex = 1.0; <@if HIFI_USE_LAYERS3@> const int layerIndices[3] = int[3](0, 1, 2); <@elif HIFI_USE_LAYERS2@> const int layerIndices[3] = int[3](1, 0, 1); <@else@> const int layerIndices[3] = int[3](0, 0, 0); <@endif@> for (int i = 0; i < 3; i++) { int layer = layerIndices[i]; <@endif@> vec3 albedoLayer = getMaterialAlbedo(mats[layer]); <$evalMaterialAlbedo(albedoTex, albedoLayer, matKeys[layer], albedoLayer)$> float cutoff = getMaterialOpacityCutoff(mats[layer]); <@if HIFI_USE_TRANSLUCENT@> float opacityLayer = getMaterialOpacity(mats[layer]); <$evalMaterialOpacity(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@else@> float opacityLayer = 1.0; <$evalMaterialOpacityMask(albedoTex.a, cutoff, opacityLayer, matKeys[layer], opacityLayer)$> <@endif@> opacityLayer *= opacityCutoffTex; vec3 emissiveLayer = getMaterialEmissive(mats[layer]); <$evalMaterialEmissive(emissiveTex, emissiveLayer, matKeys[layer], emissiveLayer)$> <@if HIFI_USE_NORMALMAP@> vec3 fragNormalWSLayer; <@if not HIFI_USE_TRIPLANAR@> <$evalMaterialNormalLOD(_positionES, normalTex, normalWS, _tangentWS, fragNormalWSLayer)$> <@else@> <$evalMaterialNormalLODTriplanar(_positionES, normalTex, normalWS, fragNormalWSLayer)$> <@endif@> <@else@> vec3 fragNormalWSLayer = normalWS; <@endif@> fragNormalWSLayer = evalFrontOrBackFaceNormal(fragNormalWSLayer); vec3 shadeLayer = getMaterialShade(mats[layer]); <$evalMaterialShade(shadeTex, shadeLayer, matKeys[layer], shadeLayer)$> float shadingShiftLayer = getMaterialShadingShift(mats[layer]); <$evalMaterialShadingShift(shadingShiftTex, shadingShiftLayer, matKeys[layer], shadingShiftLayer)$> float shadingToonyLayer = getMaterialShadingToony(mats[layer]); vec3 matcapLayer = getMaterialMatcap(mats[layer]); vec3 parametricRimLayer = getMaterialParametricRim(mats[layer]); float parametricRimFresnelPowerLayer = getMaterialParametricRimFresnelPower(mats[layer]); float parametricRimLiftLayer = getMaterialParametricRimLift(mats[layer]); float rimLightingMixLayer = getMaterialRimLightingMix(mats[layer]); <@if HIFI_USE_TRIPLANAR or HIFI_USE_SPLATMAP@> <@if HIFI_USE_TRIPLANAR@> float magnitude = layerBlend[i]; <@else@> float magnitude = layerBlend[layer]; <@endif@> albedo += albedoLayer * magnitude; opacity += opacityLayer * magnitude; emissive += emissiveLayer * magnitude; fragNormalWS += fragNormalWSLayer * magnitude; shade += shadeLayer * magnitude; shadingShift += shadingShiftLayer * magnitude; shadingToony += shadingToonyLayer * magnitude; parametricRim += parametricRimLayer * magnitude; parametricRimFresnelPower += parametricRimFresnelPowerLayer * magnitude; parametricRimLift += parametricRimLiftLayer * magnitude; rimTex += rimTexLayer * magnitude; rimLightingMix += rimLightingMixLayer * magnitude; <@else@> if (layer == NUM_LAYERS - 1) { albedo = albedoLayer; opacity = opacityLayer; emissive = emissiveLayer; fragNormalWS = fragNormalWSLayer; shade = shadeLayer; shadingShift = shadingShiftLayer; shadingToony = shadingToonyLayer; parametricRim = parametricRimLayer; parametricRimFresnelPower = parametricRimFresnelPowerLayer; parametricRimLift = parametricRimLiftLayer; rimTex = rimTexLayer; rimLightingMix = rimLightingMixLayer; } else { albedo = mix(albedo, albedoLayer, opacityLayer); <$evalLayeredOpacity(opacity, opacityLayer, opacity)$> emissive = mix(emissive, emissiveLayer, opacityLayer); fragNormalWS = mix(fragNormalWS, fragNormalWSLayer, opacityLayer); shade = mix(shade, shadeLayer, opacityLayer); shadingShift = mix(shadingShift, shadingShiftLayer, opacityLayer); shadingToony = mix(shadingToony, shadingToonyLayer, opacityLayer); parametricRim = mix(parametricRim, parametricRimLayer, opacityLayer); parametricRimFresnelPower = mix(parametricRimFresnelPower, parametricRimFresnelPowerLayer, opacityLayer); parametricRimLift = mix(parametricRimLift, parametricRimLiftLayer, opacityLayer); rimTex = mix(rimTex, rimTexLayer, opacityLayer); rimLightingMix = mix(rimLightingMix, rimLightingMixLayer, opacityLayer); } <@endif@> } fragNormalWS = normalize(fragNormalWS); <@if HIFI_USE_TRANSLUCENT@> <$discardInvisible(opacity)$> <@else@> <$discardTransparent(opacity)$> <@endif@> TransformCamera cam = getTransformCamera(); float metallic = DEFAULT_METALLIC; vec3 fresnel = getFresnelF0(metallic, albedo); vec4 color = vec4(evalGlobalLightingAlphaBlendedMToon( cam._viewInverse, 1.0, _positionES.xyz, fragNormalWS, albedo, fresnel, metallic, emissive, DEFAULT_ROUGHNESS, opacity, shade, shadingShift, shadingToony, matcap, parametricRim, parametricRimFresnelPower, parametricRimLift, rimTex, rimLightingMix, matKeys[0]), opacity); <@if HIFI_USE_FORWARD@> vec3 fragPositionWS = _positionWS.xyz; vec3 fragToEyeWS = cam._viewInverse[3].xyz - fragPositionWS; vec3 fragToEyeDirWS = normalize(fragToEyeWS); SurfaceData surfaceWS = initSurfaceData(DEFAULT_ROUGHNESS, fragNormalWS, fragToEyeDirWS); vec4 localLighting = vec4(0.0); <$fetchClusterInfo(_positionWS)$> if (hasLocalLights(numLights, clusterPos, dims)) { localLighting = evalLocalLighting(cluster, numLights, fragPositionWS, surfaceWS, metallic, fresnel, albedo, 0.0, vec4(0), vec4(0), opacity); } color.rgb += localLighting.rgb; _fragColor0 = isUnlitEnabled() * vec4(color.rgb <@if HIFI_USE_FADE@> + fadeEmissive <@endif@> , color.a); <@elif HIFI_USE_TRANSLUCENT@> packDeferredFragmentTranslucentUnlit( color.a, color.rgb <@if HIFI_USE_FADE@> + fadeEmissive <@endif@> ); <@else@> packDeferredFragmentUnlit( _prevPositionCS, fragNormalWS, 1.0, color.rgb