|
@@ -129,12 +129,14 @@ export class PBRMaterialDefines extends MaterialDefines
|
|
|
public REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = false;
|
|
|
public INVERTCUBICMAP = false;
|
|
|
public USESPHERICALFROMREFLECTIONMAP = false;
|
|
|
+ public USEIRRADIANCEMAP = false;
|
|
|
public SPHERICAL_HARMONICS = false;
|
|
|
public USESPHERICALINVERTEX = false;
|
|
|
public REFLECTIONMAP_OPPOSITEZ = false;
|
|
|
public LODINREFLECTIONALPHA = false;
|
|
|
public GAMMAREFLECTION = false;
|
|
|
public RGBDREFLECTION = false;
|
|
|
+ public LINEARSPECULARREFLECTION = false;
|
|
|
public RADIANCEOCCLUSION = false;
|
|
|
public HORIZONOCCLUSION = false;
|
|
|
|
|
@@ -219,6 +221,7 @@ export class PBRMaterialDefines extends MaterialDefines
|
|
|
public SS_LODINREFRACTIONALPHA = false;
|
|
|
public SS_GAMMAREFRACTION = false;
|
|
|
public SS_RGBDREFRACTION = false;
|
|
|
+ public SS_LINEARSPECULARREFRACTION = false;
|
|
|
public SS_LINKREFRACTIONTOTRANSPARENCY = false;
|
|
|
|
|
|
public SS_MASK_FROM_THICKNESS_TEXTURE = false;
|
|
@@ -932,6 +935,9 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
if (!reflectionTexture.isReadyOrNotBlocking()) {
|
|
|
return false;
|
|
|
}
|
|
|
+ if (reflectionTexture.irradianceTexture && !reflectionTexture.irradianceTexture.isReadyOrNotBlocking()) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (this._lightmapTexture && MaterialFlags.LightmapTextureEnabled) {
|
|
@@ -1100,6 +1106,10 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
fallbacks.addFallback(fallbackRank++, "USESPHERICALFROMREFLECTIONMAP");
|
|
|
}
|
|
|
|
|
|
+ if (defines.USEIRRADIANCEMAP) {
|
|
|
+ fallbacks.addFallback(fallbackRank++, "USEIRRADIANCEMAP");
|
|
|
+ }
|
|
|
+
|
|
|
if (defines.LIGHTMAP) {
|
|
|
fallbacks.addFallback(fallbackRank++, "LIGHTMAP");
|
|
|
}
|
|
@@ -1182,7 +1192,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
|
|
|
var samplers = ["albedoSampler", "reflectivitySampler", "ambientSampler", "emissiveSampler",
|
|
|
"bumpSampler", "lightmapSampler", "opacitySampler",
|
|
|
- "reflectionSampler", "reflectionSamplerLow", "reflectionSamplerHigh",
|
|
|
+ "reflectionSampler", "reflectionSamplerLow", "reflectionSamplerHigh", "irradianceSampler",
|
|
|
"microSurfaceSampler", "environmentBrdfSampler", "boneSampler"];
|
|
|
|
|
|
var uniformBuffers = ["Material", "Scene"];
|
|
@@ -1277,6 +1287,7 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
defines.RGBDREFLECTION = reflectionTexture.isRGBD;
|
|
|
defines.REFLECTIONMAP_OPPOSITEZ = this.getScene().useRightHandedSystem ? !reflectionTexture.invertZ : reflectionTexture.invertZ;
|
|
|
defines.LODINREFLECTIONALPHA = reflectionTexture.lodLevelInAlpha;
|
|
|
+ defines.LINEARSPECULARREFLECTION = reflectionTexture.linearSpecularLOD;
|
|
|
|
|
|
if (reflectionTexture.coordinatesMode === Texture.INVCUBIC_MODE) {
|
|
|
defines.INVERTCUBICMAP = true;
|
|
@@ -1329,8 +1340,13 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
}
|
|
|
|
|
|
if (reflectionTexture.coordinatesMode !== Texture.SKYBOX_MODE) {
|
|
|
- if (reflectionTexture.sphericalPolynomial) {
|
|
|
+ if (reflectionTexture.irradianceTexture) {
|
|
|
+ defines.USEIRRADIANCEMAP = true;
|
|
|
+ defines.USESPHERICALFROMREFLECTIONMAP = false;
|
|
|
+ }
|
|
|
+ else if (reflectionTexture.sphericalPolynomial) {
|
|
|
defines.USESPHERICALFROMREFLECTIONMAP = true;
|
|
|
+ defines.USEIRRADIANCEMAP = false;
|
|
|
if (this._forceIrradianceInFragment || scene.getEngine().getCaps().maxVaryingVectors <= 8) {
|
|
|
defines.USESPHERICALINVERTEX = false;
|
|
|
}
|
|
@@ -1358,11 +1374,13 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
defines.REFLECTIONMAP_MIRROREDEQUIRECTANGULAR_FIXED = false;
|
|
|
defines.INVERTCUBICMAP = false;
|
|
|
defines.USESPHERICALFROMREFLECTIONMAP = false;
|
|
|
+ defines.USEIRRADIANCEMAP = false;
|
|
|
defines.USESPHERICALINVERTEX = false;
|
|
|
defines.REFLECTIONMAP_OPPOSITEZ = false;
|
|
|
defines.LODINREFLECTIONALPHA = false;
|
|
|
defines.GAMMAREFLECTION = false;
|
|
|
defines.RGBDREFLECTION = false;
|
|
|
+ defines.LINEARSPECULARREFLECTION = false;
|
|
|
}
|
|
|
|
|
|
if (this._lightmapTexture && MaterialFlags.LightmapTextureEnabled) {
|
|
@@ -1671,34 +1689,36 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
ubo.updateVector3("vReflectionSize", cubeTexture.boundingBoxSize);
|
|
|
}
|
|
|
|
|
|
- var polynomials = reflectionTexture.sphericalPolynomial;
|
|
|
- if (defines.USESPHERICALFROMREFLECTIONMAP && polynomials) {
|
|
|
- if (defines.SPHERICAL_HARMONICS) {
|
|
|
- const preScaledHarmonics = polynomials.preScaledHarmonics;
|
|
|
- this._activeEffect.setVector3("vSphericalL00", preScaledHarmonics.l00);
|
|
|
- this._activeEffect.setVector3("vSphericalL1_1", preScaledHarmonics.l1_1);
|
|
|
- this._activeEffect.setVector3("vSphericalL10", preScaledHarmonics.l10);
|
|
|
- this._activeEffect.setVector3("vSphericalL11", preScaledHarmonics.l11);
|
|
|
- this._activeEffect.setVector3("vSphericalL2_2", preScaledHarmonics.l2_2);
|
|
|
- this._activeEffect.setVector3("vSphericalL2_1", preScaledHarmonics.l2_1);
|
|
|
- this._activeEffect.setVector3("vSphericalL20", preScaledHarmonics.l20);
|
|
|
- this._activeEffect.setVector3("vSphericalL21", preScaledHarmonics.l21);
|
|
|
- this._activeEffect.setVector3("vSphericalL22", preScaledHarmonics.l22);
|
|
|
- }
|
|
|
- else {
|
|
|
- this._activeEffect.setFloat3("vSphericalX", polynomials.x.x, polynomials.x.y, polynomials.x.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalY", polynomials.y.x, polynomials.y.y, polynomials.y.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalZ", polynomials.z.x, polynomials.z.y, polynomials.z.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalXX_ZZ", polynomials.xx.x - polynomials.zz.x,
|
|
|
- polynomials.xx.y - polynomials.zz.y,
|
|
|
- polynomials.xx.z - polynomials.zz.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalYY_ZZ", polynomials.yy.x - polynomials.zz.x,
|
|
|
- polynomials.yy.y - polynomials.zz.y,
|
|
|
- polynomials.yy.z - polynomials.zz.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalZZ", polynomials.zz.x, polynomials.zz.y, polynomials.zz.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalXY", polynomials.xy.x, polynomials.xy.y, polynomials.xy.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalYZ", polynomials.yz.x, polynomials.yz.y, polynomials.yz.z);
|
|
|
- this._activeEffect.setFloat3("vSphericalZX", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z);
|
|
|
+ if (!defines.USEIRRADIANCEMAP) {
|
|
|
+ var polynomials = reflectionTexture.sphericalPolynomial;
|
|
|
+ if (defines.USESPHERICALFROMREFLECTIONMAP && polynomials) {
|
|
|
+ if (defines.SPHERICAL_HARMONICS) {
|
|
|
+ const preScaledHarmonics = polynomials.preScaledHarmonics;
|
|
|
+ this._activeEffect.setVector3("vSphericalL00", preScaledHarmonics.l00);
|
|
|
+ this._activeEffect.setVector3("vSphericalL1_1", preScaledHarmonics.l1_1);
|
|
|
+ this._activeEffect.setVector3("vSphericalL10", preScaledHarmonics.l10);
|
|
|
+ this._activeEffect.setVector3("vSphericalL11", preScaledHarmonics.l11);
|
|
|
+ this._activeEffect.setVector3("vSphericalL2_2", preScaledHarmonics.l2_2);
|
|
|
+ this._activeEffect.setVector3("vSphericalL2_1", preScaledHarmonics.l2_1);
|
|
|
+ this._activeEffect.setVector3("vSphericalL20", preScaledHarmonics.l20);
|
|
|
+ this._activeEffect.setVector3("vSphericalL21", preScaledHarmonics.l21);
|
|
|
+ this._activeEffect.setVector3("vSphericalL22", preScaledHarmonics.l22);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ this._activeEffect.setFloat3("vSphericalX", polynomials.x.x, polynomials.x.y, polynomials.x.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalY", polynomials.y.x, polynomials.y.y, polynomials.y.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalZ", polynomials.z.x, polynomials.z.y, polynomials.z.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalXX_ZZ", polynomials.xx.x - polynomials.zz.x,
|
|
|
+ polynomials.xx.y - polynomials.zz.y,
|
|
|
+ polynomials.xx.z - polynomials.zz.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalYY_ZZ", polynomials.yy.x - polynomials.zz.x,
|
|
|
+ polynomials.yy.y - polynomials.zz.y,
|
|
|
+ polynomials.yy.z - polynomials.zz.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalZZ", polynomials.zz.x, polynomials.zz.y, polynomials.zz.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalXY", polynomials.xy.x, polynomials.xy.y, polynomials.xy.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalYZ", polynomials.yz.x, polynomials.yz.y, polynomials.yz.z);
|
|
|
+ this._activeEffect.setFloat3("vSphericalZX", polynomials.zx.x, polynomials.zx.y, polynomials.zx.z);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1800,6 +1820,10 @@ export abstract class PBRBaseMaterial extends PushMaterial {
|
|
|
ubo.setTexture("reflectionSamplerLow", reflectionTexture._lodTextureLow || reflectionTexture);
|
|
|
ubo.setTexture("reflectionSamplerHigh", reflectionTexture._lodTextureHigh || reflectionTexture);
|
|
|
}
|
|
|
+
|
|
|
+ if (defines.USEIRRADIANCEMAP) {
|
|
|
+ ubo.setTexture("irradianceSampler", reflectionTexture.irradianceTexture);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (defines.ENVIRONMENTBRDF) {
|