UNPKG

@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.

221 lines 9.27 kB
// Do not edit. import { ShaderStore } from "../../Engines/shaderStore.js"; const name = "openpbrIblFunctions"; const shader = `#ifdef REFLECTION vec3 sampleIrradiance( in vec3 surfaceNormal #if defined(NORMAL) && defined(USESPHERICALINVERTEX) ,in vec3 vEnvironmentIrradianceSH #endif #if (defined(USESPHERICALFROMREFLECTIONMAP) && (!defined(NORMAL) || !defined(USESPHERICALINVERTEX))) || (defined(USEIRRADIANCEMAP) && defined(REFLECTIONMAP_3D)) ,in mat4 iblMatrix #endif #ifdef USEIRRADIANCEMAP #ifdef REFLECTIONMAP_3D ,in samplerCube irradianceSampler #else ,in sampler2D irradianceSampler #endif #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION ,in vec3 reflectionDominantDirection #endif #endif #ifdef REALTIME_FILTERING ,in vec2 vReflectionFilteringInfo #ifdef IBL_CDF_FILTERING ,in sampler2D icdfSampler #endif #endif ,in vec2 vReflectionInfos ,in vec3 viewDirectionW ,in float diffuseRoughness ,in vec3 surfaceAlbedo ) {vec3 environmentIrradiance=vec3(0.,0.,0.); #if (defined(USESPHERICALFROMREFLECTIONMAP) && (!defined(NORMAL) || !defined(USESPHERICALINVERTEX))) || (defined(USEIRRADIANCEMAP) && defined(REFLECTIONMAP_3D)) vec3 irradianceVector=(iblMatrix*vec4(surfaceNormal,0)).xyz;vec3 irradianceView=(iblMatrix*vec4(viewDirectionW,0)).xyz; #if !defined(USE_IRRADIANCE_DOMINANT_DIRECTION) && !defined(REALTIME_FILTERING) #if BASE_DIFFUSE_MODEL != BRDF_DIFFUSE_MODEL_LAMBERT && BASE_DIFFUSE_MODEL != BRDF_DIFFUSE_MODEL_LEGACY {float NdotV=max(dot(surfaceNormal,viewDirectionW),0.0);irradianceVector=mix(irradianceVector,irradianceView,(0.5*(1.0-NdotV))*diffuseRoughness);} #endif #endif #ifdef REFLECTIONMAP_OPPOSITEZ irradianceVector.z*=-1.0; #endif #ifdef INVERTCUBICMAP irradianceVector.y*=-1.0; #endif #endif #ifdef USESPHERICALFROMREFLECTIONMAP #if defined(NORMAL) && defined(USESPHERICALINVERTEX) environmentIrradiance=vEnvironmentIrradianceSH; #else #if defined(REALTIME_FILTERING) environmentIrradiance=irradiance(reflectionSampler,irradianceVector,vReflectionFilteringInfo,diffuseRoughness,surfaceAlbedo,irradianceView #ifdef IBL_CDF_FILTERING ,icdfSampler #endif ); #else environmentIrradiance=computeEnvironmentIrradiance(irradianceVector); #endif #endif #elif defined(USEIRRADIANCEMAP) #ifdef REFLECTIONMAP_3D vec4 environmentIrradianceFromTexture=sampleReflection(irradianceSampler,irradianceVector); #else vec4 environmentIrradianceFromTexture=sampleReflection(irradianceSampler,reflectionCoords); #endif environmentIrradiance=environmentIrradianceFromTexture.rgb; #ifdef RGBDREFLECTION environmentIrradiance.rgb=fromRGBD(environmentIrradianceFromTexture); #endif #ifdef GAMMAREFLECTION environmentIrradiance.rgb=toLinearSpace(environmentIrradiance.rgb); #endif #ifdef USE_IRRADIANCE_DOMINANT_DIRECTION vec3 Ls=normalize(reflectionDominantDirection);float NoL=dot(irradianceVector,Ls);float NoV=dot(irradianceVector,irradianceView);vec3 diffuseRoughnessTerm=vec3(1.0); #if BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_EON 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))); #elif BASE_DIFFUSE_MODEL==BRDF_DIFFUSE_MODEL_BURLEY vec3 H=(irradianceView+Ls)*0.5;float VoH=dot(irradianceView,H);diffuseRoughnessTerm=vec3(diffuseBRDF_Burley(NoL,NoV,VoH,diffuseRoughness)*PI); #endif environmentIrradiance=environmentIrradiance.rgb*diffuseRoughnessTerm; #endif #endif environmentIrradiance*=vReflectionInfos.x;return environmentIrradiance;} #define pbr_inline #ifdef REFLECTIONMAP_3D vec3 createReflectionCoords( #else vec2 createReflectionCoords( #endif in vec3 vPositionW ,in vec3 normalW ) {vec3 reflectionVector=computeReflectionCoords(vec4(vPositionW,1.0),normalW); #ifdef REFLECTIONMAP_OPPOSITEZ reflectionVector.z*=-1.0; #endif #ifdef REFLECTIONMAP_3D vec3 reflectionCoords=reflectionVector; #else vec2 reflectionCoords=reflectionVector.xy; #ifdef REFLECTIONMAP_PROJECTION reflectionCoords/=reflectionVector.z; #endif reflectionCoords.y=1.0-reflectionCoords.y; #endif return reflectionCoords;} #define pbr_inline #define inline vec3 sampleRadiance( in float alphaG ,in vec3 vReflectionMicrosurfaceInfos ,in vec2 vReflectionInfos ,in geometryInfoOutParams geoInfo #ifdef REFLECTIONMAP_3D ,in samplerCube reflectionSampler ,const vec3 reflectionCoords #else ,in sampler2D reflectionSampler ,const vec2 reflectionCoords #endif #ifdef REALTIME_FILTERING ,in vec2 vReflectionFilteringInfo #endif ) {vec4 environmentRadiance=vec4(0.,0.,0.,0.); #if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX) float reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG,geoInfo.NdotVUnclamped); #elif defined(LINEARSPECULARREFLECTION) float reflectionLOD=getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x,roughness); #else float reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG); #endif reflectionLOD=reflectionLOD*vReflectionMicrosurfaceInfos.y+vReflectionMicrosurfaceInfos.z; #ifdef REALTIME_FILTERING environmentRadiance=vec4(radiance(alphaG,reflectionSampler,reflectionCoords,vReflectionFilteringInfo),1.0); #else environmentRadiance=sampleReflectionLod(reflectionSampler,reflectionCoords,reflectionLOD); #endif #ifdef RGBDREFLECTION environmentRadiance.rgb=fromRGBD(environmentRadiance); #endif #ifdef GAMMAREFLECTION environmentRadiance.rgb=toLinearSpace(environmentRadiance.rgb); #endif environmentRadiance.rgb*=vec3(vReflectionInfos.x);return environmentRadiance.rgb;} #if defined(ANISOTROPIC) #define pbr_inline #define inline vec3 sampleRadianceAnisotropic( in float alphaG ,in vec3 vReflectionMicrosurfaceInfos ,in vec2 vReflectionInfos ,in geometryInfoAnisoOutParams geoInfo ,const vec3 normalW ,const vec3 viewDirectionW ,const vec3 positionW ,const vec3 noise #ifdef REFLECTIONMAP_3D ,in samplerCube reflectionSampler #else ,in sampler2D reflectionSampler #endif #ifdef REALTIME_FILTERING ,in vec2 vReflectionFilteringInfo #endif ) {vec4 environmentRadiance=vec4(0.,0.,0.,0.);float alphaT=alphaG*sqrt(2.0/(1.0+(1.0-geoInfo.anisotropy)*(1.0-geoInfo.anisotropy)));float alphaB=(1.0-geoInfo.anisotropy)*alphaT;alphaG=alphaB; #if defined(LODINREFLECTIONALPHA) && !defined(REFLECTIONMAP_SKYBOX) float reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG,geoInfo.NdotVUnclamped); #elif defined(LINEARSPECULARREFLECTION) float reflectionLOD=getLinearLodFromRoughness(vReflectionMicrosurfaceInfos.x,roughness); #else float reflectionLOD=getLodFromAlphaG(vReflectionMicrosurfaceInfos.x,alphaG); #endif reflectionLOD=reflectionLOD*vReflectionMicrosurfaceInfos.y+vReflectionMicrosurfaceInfos.z; #ifdef REALTIME_FILTERING vec3 view=(reflectionMatrix*vec4(viewDirectionW,0.0)).xyz;vec3 tangent=(reflectionMatrix*vec4(geoInfo.anisotropicTangent,0.0)).xyz;vec3 bitangent=(reflectionMatrix*vec4(geoInfo.anisotropicBitangent,0.0)).xyz;vec3 normal=(reflectionMatrix*vec4(normalW,0.0)).xyz; #ifdef REFLECTIONMAP_OPPOSITEZ view.z*=-1.0;tangent.z*=-1.0;bitangent.z*=-1.0;normal.z*=-1.0; #endif environmentRadiance = vec4(radianceAnisotropic(alphaT,alphaB,reflectionSampler, view,tangent, bitangent,normal, vReflectionFilteringInfo,noise.xy), 1.0); #else const int samples=16;vec4 radianceSample=vec4(0.0);vec3 reflectionCoords=vec3(0.0);float sample_weight=0.0;float total_weight=0.0;float step=1.0/float(max(samples-1,1));for (int i=0; i<samples; ++i) {float t=mix(-1.0,1.0,float(i)*step);t+=step*2.0*noise.x;sample_weight=max(1.0-abs(t),0.001);sample_weight*=sample_weight;t*=min(4.0*alphaT*geoInfo.anisotropy,1.0);vec3 bentNormal;if (t<0.0) {float blend=t+1.0;bentNormal=normalize(mix(-geoInfo.anisotropicTangent,normalW,blend));} else if (t>0.0) {float blend=t;bentNormal=normalize(mix(normalW,geoInfo.anisotropicTangent,blend));} else {bentNormal=normalW;} reflectionCoords=createReflectionCoords(positionW,bentNormal);radianceSample=sampleReflectionLod(reflectionSampler,reflectionCoords,reflectionLOD); #ifdef RGBDREFLECTION environmentRadiance.rgb+=sample_weight*fromRGBD(radianceSample); #elif defined(GAMMAREFLECTION) environmentRadiance.rgb+=sample_weight*toLinearSpace(radianceSample.rgb); #else environmentRadiance.rgb+=sample_weight*radianceSample.rgb; #endif total_weight+=sample_weight;} environmentRadiance=vec4(environmentRadiance.xyz/float(total_weight),1.0); #endif environmentRadiance.rgb*=vec3(vReflectionInfos.x);return environmentRadiance.rgb;} #endif #define pbr_inline vec3 conductorIblFresnel(in ReflectanceParams reflectance,in float NdotV,in float roughness,in vec3 environmentBrdf) { #if (CONDUCTOR_SPECULAR_MODEL==CONDUCTOR_SPECULAR_MODEL_OPENPBR) vec3 albedoF0=mix(reflectance.coloredF0,pow(reflectance.coloredF0,vec3(1.4)),roughness);return getF82Specular(NdotV,albedoF0,reflectance.coloredF90,roughness); #else return getReflectanceFromBRDFLookup(reflectance.coloredF0,reflectance.coloredF90,environmentBrdf); #endif } #endif `; // Sideeffect if (!ShaderStore.IncludesShadersStore[name]) { ShaderStore.IncludesShadersStore[name] = shader; } /** @internal */ export const openpbrIblFunctions = { name, shader }; //# sourceMappingURL=openpbrIblFunctions.js.map