@babylonjs/core
Version:
Getting started? Play directly with the Babylon.js API using our [playground](https://playground.babylonjs.com/). It also contains a lot of samples to learn how to use it.
296 lines • 9.59 kB
JavaScript
// Do not edit.
import { ShaderStore } from "../../Engines/shaderStore.js";
const name = "pbrBlockReflection";
const shader = `
struct reflectionOutParams
{vec4 environmentRadiance;vec3 environmentIrradiance;
vec3 reflectionCoords;
vec2 reflectionCoords;
vec3 irradianceVector;
};
void createReflectionCoords(
in vec3 vPositionW,
in vec3 normalW,
in anisotropicOutParams anisotropicOut,
out vec3 reflectionCoords
out vec2 reflectionCoords
)
{
vec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),anisotropicOut.anisotropicNormal);
vec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),normalW);
reflectionVector.z*=-1.0;
reflectionCoords=reflectionVector;
reflectionCoords=reflectionVector.xy;
reflectionCoords/=reflectionVector.z;
reflectionCoords.y=1.0-reflectionCoords.y;
}
void sampleReflectionTexture(
in float alphaG,
in vec3 vReflectionMicrosurfaceInfos,
in vec2 vReflectionInfos,
in vec3 vReflectionColor,
in float NdotVUnclamped,
in float roughness,
in samplerCube reflectionSampler,
const vec3 reflectionCoords,
in sampler2D reflectionSampler,
const vec2 reflectionCoords,
in samplerCube reflectionSamplerLow,
in samplerCube reflectionSamplerHigh,
in sampler2D reflectionSamplerLow,
in sampler2D reflectionSamplerHigh,
in vec2 vReflectionFilteringInfo,
out vec4 environmentRadiance
)
{
float reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG,NdotVUnclamped);
float reflectionLOD=getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x,roughness);
float reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG);
reflectionLOD=reflectionLOD*vReflectionMicrosurfaceInfos.y+vReflectionMicrosurfaceInfos.z;
float automaticReflectionLOD=UNPACK_LOD(sampleReflection(reflectionSampler,reflectionCoords).a);float requestedReflectionLOD=max(automaticReflectionLOD,reflectionLOD);
float requestedReflectionLOD=reflectionLOD;
environmentRadiance=vec4(radiance(alphaG,reflectionSampler,reflectionCoords,vReflectionFilteringInfo),1.0);
environmentRadiance=sampleReflectionLod(reflectionSampler,reflectionCoords,reflectionLOD);
float lodReflectionNormalized=saturate(reflectionLOD/log2(vReflectionMicrosurfaceInfos.x));float lodReflectionNormalizedDoubled=lodReflectionNormalized*2.0;vec4 environmentMid=sampleReflection(reflectionSampler,reflectionCoords);if (lodReflectionNormalizedDoubled<1.0){environmentRadiance=mix(
sampleReflection(reflectionSamplerHigh,reflectionCoords),
environmentMid,
lodReflectionNormalizedDoubled
);} else {environmentRadiance=mix(
environmentMid,
sampleReflection(reflectionSamplerLow,reflectionCoords),
lodReflectionNormalizedDoubled-1.0
);}
environmentRadiance.rgb=fromRGBD(environmentRadiance);
environmentRadiance.rgb=toLinearSpace(environmentRadiance.rgb);
environmentRadiance.rgb*=vReflectionInfos.x;environmentRadiance.rgb*=vReflectionColor.rgb;}
reflectionOutParams reflectionBlock(
in vec3 vPositionW
,in vec3 normalW
,in float alphaG
,in vec3 vReflectionMicrosurfaceInfos
,in vec2 vReflectionInfos
,in vec3 vReflectionColor
,in anisotropicOutParams anisotropicOut
,in float NdotVUnclamped
,in float roughness
,in samplerCube reflectionSampler
,in sampler2D reflectionSampler
,in vec3 vEnvironmentIrradiance
,in mat4 reflectionMatrix
,in samplerCube irradianceSampler
,in sampler2D irradianceSampler
,in vec3 reflectionDominantDirection
,in samplerCube reflectionSamplerLow
,in samplerCube reflectionSamplerHigh
,in sampler2D reflectionSamplerLow
,in sampler2D reflectionSamplerHigh
,in vec2 vReflectionFilteringInfo
,in sampler2D icdfSampler
,in vec3 viewDirectionW
,in float diffuseRoughness
,in vec3 surfaceAlbedo
)
{reflectionOutParams outParams;vec4 environmentRadiance=vec4(0.,0.,0.,0.);
vec3 reflectionCoords=vec3(0.);
vec2 reflectionCoords=vec2(0.);
createReflectionCoords(
vPositionW,
normalW,
anisotropicOut,
reflectionCoords
);sampleReflectionTexture(
alphaG,
vReflectionMicrosurfaceInfos,
vReflectionInfos,
vReflectionColor,
NdotVUnclamped,
roughness,
reflectionSampler,
reflectionCoords,
reflectionSampler,
reflectionCoords,
reflectionSamplerLow,
reflectionSamplerHigh,
vReflectionFilteringInfo,
environmentRadiance
);vec3 environmentIrradiance=vec3(0.,0.,0.);
vec3 irradianceVector=vec3(reflectionMatrix*vec4(anisotropicOut.anisotropicNormal,0)).xyz;
vec3 irradianceVector=vec3(reflectionMatrix*vec4(normalW,0)).xyz;
vec3 irradianceView=vec3(reflectionMatrix*vec4(viewDirectionW,0)).xyz;
float NdotV=max(dot(normalW,viewDirectionW),0.0);irradianceVector=mix(irradianceVector,irradianceView,(0.5*(1.0-NdotV))*diffuseRoughness);
irradianceVector.z*=-1.0;
irradianceVector.y*=-1.0;
environmentIrradiance=vEnvironmentIrradiance;
environmentIrradiance=irradiance(reflectionSampler,irradianceVector,vReflectionFilteringInfo,diffuseRoughness,surfaceAlbedo,irradianceView
,icdfSampler
);
environmentIrradiance=computeEnvironmentIrradiance(irradianceVector);
outParams.irradianceVector=irradianceVector;
vec4 environmentIrradiance4=sampleReflection(irradianceSampler,irradianceVector);
vec4 environmentIrradiance4=sampleReflection(irradianceSampler,reflectionCoords);
environmentIrradiance=environmentIrradiance4.rgb;
environmentIrradiance.rgb=fromRGBD(environmentIrradiance4);
environmentIrradiance.rgb=toLinearSpace(environmentIrradiance.rgb);
vec3 Ls=normalize(reflectionDominantDirection);float NoL=dot(irradianceVector,Ls);float NoV=dot(irradianceVector,irradianceView);vec3 diffuseRoughnessTerm=vec3(1.0);
float LoV=dot (Ls,irradianceView);float mag=length(reflectionDominantDirection)*2.0;vec3 clampedAlbedo=clamp(surfaceAlbedo,vec3(0.1),vec3(1.0));diffuseRoughnessTerm=diffuseBRDF_EON(clampedAlbedo,diffuseRoughness,NoL,NoV,LoV)*PI;diffuseRoughnessTerm=diffuseRoughnessTerm/clampedAlbedo;diffuseRoughnessTerm=mix(vec3(1.0),diffuseRoughnessTerm,sqrt(clamp(mag*NoV,0.0,1.0)));
vec3 H=(irradianceView+Ls)*0.5;float VoH=dot(irradianceView,H);diffuseRoughnessTerm=vec3(diffuseBRDF_Burley(NoL,NoV,VoH,diffuseRoughness)*PI);
environmentIrradiance=environmentIrradiance.rgb*diffuseRoughnessTerm;
environmentIrradiance*=vReflectionColor.rgb*vReflectionInfos.x;
outParams.environmentRadiance=vec4(mix(environmentRadiance.rgb,environmentIrradiance,alphaG),environmentRadiance.a);
outParams.environmentRadiance=environmentRadiance;
outParams.environmentIrradiance=environmentIrradiance;outParams.reflectionCoords=reflectionCoords;return outParams;}
`;
// Sideeffect
if (!ShaderStore.IncludesShadersStore[name]) {
ShaderStore.IncludesShadersStore[name] = shader;
}
/** @internal */
export const pbrBlockReflection = { name, shader };
//# sourceMappingURL=pbrBlockReflection.js.map