Skip to content

Commit b677bd5

Browse files
authored
Revert recent material chunk changes (playcanvas#3208)
* Revert "remove fresnel calculation from Phong specular lighting chunk (playcanvas#3196)" This reverts commit 45f2f73. * Revert "fix opacityFadesSpecular = false (playcanvas#3192)" This reverts commit 6b0c34f. * Revert "Fix Area Lights and Half angle fresnel changes (playcanvas#3190)" This reverts commit 445dbc5. * Revert "Half angle fresnel (playcanvas#3172)" This reverts commit d58f672. * Revert "Environment brdf fix (playcanvas#3157)" This reverts commit 5f1aa56.
1 parent c017c17 commit b677bd5

24 files changed

+135
-149
lines changed

examples/graphics/material-anisotropic.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@
7676

7777
var createSphere = function (x, y, z) {
7878
var material = new pc.StandardMaterial();
79-
material.diffuse = new pc.Color(1, 1, 1);
8079
material.metalness = 1.0;
8180
material.shininess = (z) / (NUM_SPHERES_Z - 1) * 100;
8281
material.useMetalness = true;

src/graphics/program-lib/chunks/chunks.js

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ import dpAtlasQuadPS from './dpAtlasQuad.frag';
4141
import emissivePS from './emissive.frag';
4242
import endPS from './end.frag';
4343
import endVS from './end.vert';
44-
import envBrdfNonePS from './envBrdfNone.frag';
45-
import envBrdfApproxPS from './envBrdfApprox.frag';
4644
import envConstPS from './envConst.frag';
4745
import envMultiplyPS from './envMultiply.frag';
4846
import extensionPS from './extension.frag';
@@ -249,8 +247,6 @@ var shaderChunks = {
249247
emissivePS: emissivePS,
250248
endPS: endPS,
251249
endVS: endVS,
252-
envBrdfApproxPS: envBrdfApproxPS,
253-
envBrdfNonePS: envBrdfNonePS,
254250
envConstPS: envConstPS,
255251
envMultiplyPS: envMultiplyPS,
256252
extensionPS: extensionPS,
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
vec3 combineColorCC() {
2-
return combineColor() + (ccSpecularLight + ccReflection.rgb * ccReflection.a);
2+
return combineColor()+(ccSpecularLight*ccSpecularity+ccReflection.rgb*ccSpecularity*ccReflection.a);
33
}
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
11
vec3 combineColor() {
2-
// NB energy conservation has changed with half-angle fresnel
3-
return dAlbedo * dDiffuseLight + dSpecularLight + dReflection.rgb * dReflection.a;
2+
return mix(dAlbedo * dDiffuseLight, dSpecularLight + dReflection.rgb * dReflection.a, dSpecularity);
43
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
vec3 combineColor() {
2-
return dAlbedo * dDiffuseLight + dSpecularLight + dReflection.rgb * dReflection.a;
2+
return dAlbedo * dDiffuseLight + (dSpecularLight + dReflection.rgb * dReflection.a) * dSpecularity;
33
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
vec3 combineColor() {
2-
return dAlbedo * dDiffuseLight + dSpecularLight;
2+
return dAlbedo * dDiffuseLight + dSpecularLight * dSpecularity;
33
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
uniform vec3 material_ambient;
22

33
vec3 combineColor() {
4-
return (dDiffuseLight - light_globalAmbient) * dAlbedo + dSpecularLight + material_ambient * light_globalAmbient;
4+
return (dDiffuseLight - light_globalAmbient) * dAlbedo + dSpecularLight * dSpecularity + material_ambient * light_globalAmbient;
55
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
vec3 combineColor() {
2-
return mix(dAlbedo * dDiffuseLight + dSpecularLight, dReflection.rgb, dReflection.a);
2+
return mix(dAlbedo * dDiffuseLight + dSpecularLight * dSpecularity, dReflection.rgb, dReflection.a);
33
}

src/graphics/program-lib/chunks/envBrdfApprox.frag

Lines changed: 0 additions & 9 deletions
This file was deleted.

src/graphics/program-lib/chunks/envBrdfNone.frag

Lines changed: 0 additions & 3 deletions
This file was deleted.
Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,18 @@
11
// Schlick's approximation
2+
uniform float material_fresnelFactor; // unused
23

3-
vec3 calcFresnel(float cosTheta, vec3 F0)
4-
{
5-
return F0 + (1.0 - F0) * pow(max(1.0 - cosTheta, 0.0), 5.0);
6-
}
7-
8-
vec3 calcFresnel(float cosTheta, vec3 F0, float glossiness)
9-
{
10-
float fresnel = 1.0 - cosTheta;
4+
void getFresnel() {
5+
float fresnel = 1.0 - max(dot(dNormalW, dViewDirW), 0.0);
116
float fresnel2 = fresnel * fresnel;
127
fresnel *= fresnel2 * fresnel2;
13-
fresnel *= glossiness * glossiness;
14-
return F0 + (1.0 - F0) * fresnel;
8+
fresnel *= dGlossiness * dGlossiness;
9+
dSpecularity = dSpecularity + (1.0 - dSpecularity) * fresnel;
10+
11+
#ifdef CLEARCOAT
12+
fresnel = 1.0 - max(dot(ccNormalW, dViewDirW), 0.0);
13+
fresnel2 = fresnel * fresnel;
14+
fresnel *= fresnel2 * fresnel2;
15+
fresnel *= ccGlossiness * ccGlossiness;
16+
ccSpecularity = ccSpecularity + (1.0 - ccSpecularity) * fresnel;
17+
#endif
1518
}

src/graphics/program-lib/chunks/lightSpecularAnisoGGX.frag

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// Anisotropic GGX
2-
3-
vec3 calcLightSpecular(float tGlossiness, vec3 tNormalW, vec3 F0, out vec3 tFresnel) {
2+
float calcLightSpecular(float tGlossiness, vec3 tNormalW) {
43
float PI = 3.141592653589793;
54
float roughness = max((1.0 - tGlossiness) * (1.0 - tGlossiness), 0.001);
65
float anisotropy = material_anisotropy * roughness;
@@ -31,18 +30,13 @@ vec3 calcLightSpecular(float tGlossiness, vec3 tNormalW, vec3 F0, out vec3 tFres
3130
float lambdaL = NoV * length(vec3(at * ToL, ab * BoL, NoL));
3231
float G = 0.5 / (lambdaV + lambdaL);
3332

34-
vec3 F = calcFresnel(NoH, F0);
35-
36-
tFresnel = F;
37-
38-
return D * G * F;
33+
return D * G;
3934
}
4035

41-
vec3 getLightSpecular() {
42-
return calcLightSpecular(dGlossiness, dNormalW, dSpecularity, dLightFresnel);
36+
float getLightSpecular() {
37+
return calcLightSpecular(dGlossiness, dNormalW);
4338
}
4439

45-
vec3 getLightSpecularCC() {
46-
47-
return calcLightSpecular(ccGlossiness, ccNormalW, vec3(ccSpecularity), ccLightFresnel);
40+
float getLightSpecularCC() {
41+
return calcLightSpecular(ccGlossiness, ccNormalW);
4842
}
Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Energy-conserving (hopefully) Blinn-Phong
2-
vec3 calcLightSpecular(float tGlossiness, vec3 tNormalW, vec3 F0, out vec3 tFresnel) {
2+
float calcLightSpecular(float tGlossiness, vec3 tNormalW) {
33
vec3 h = normalize( -dLightDirNormW + dViewDirW );
44
float nh = max( dot( h, tNormalW ), 0.0 );
55

@@ -9,17 +9,13 @@ vec3 calcLightSpecular(float tGlossiness, vec3 tNormalW, vec3 F0, out vec3 tFres
99
// Hack: On Mac OS X, calling pow with zero for the exponent generates hideous artifacts so bias up a little
1010
specPow = max(specPow, 0.0001);
1111

12-
vec3 F = calcFresnel(nh, F0);
13-
14-
tFresnel = F;
15-
16-
return F * pow(nh, specPow) * (specPow + 2.0) / 8.0;
12+
return pow(nh, specPow) * (specPow + 2.0) / 8.0;
1713
}
1814

19-
vec3 getLightSpecular() {
20-
return calcLightSpecular(dGlossiness, dNormalW, dSpecularity, dLightFresnel);
15+
float getLightSpecular() {
16+
return calcLightSpecular(dGlossiness, dNormalW);
2117
}
2218

23-
vec3 getLightSpecularCC() {
24-
return calcLightSpecular(ccGlossiness, ccNormalW, vec3(ccSpecularity), ccLightFresnel);
19+
float getLightSpecularCC() {
20+
return calcLightSpecular(ccGlossiness, ccNormalW);
2521
}
Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
1-
vec3 calcLightSpecular(float tGlossiness, vec3 tReflDirW, vec3 F0, out vec3 tFresnel) {
1+
float calcLightSpecular(float tGlossiness, vec3 tReflDirW) {
22
float specPow = tGlossiness;
33

44
specPow = antiAliasGlossiness(specPow);
55

6-
float rl = max(dot(tReflDirW, -dLightDirNormW), 0.0);
7-
86
// Hack: On Mac OS X, calling pow with zero for the exponent generates hideous artifacts so bias up a little
9-
return vec3(pow(rl, specPow + 0.0001));
7+
return pow(max(dot(tReflDirW, -dLightDirNormW), 0.0), specPow + 0.0001);
108
}
119

12-
vec3 getLightSpecular() {
13-
return calcLightSpecular(dGlossiness, dNormalW, dSpecularity, dLightFresnel);
10+
float getLightSpecular() {
11+
return calcLightSpecular(dGlossiness, dReflDirW);
1412
}
1513

16-
vec3 getLightSpecularCC() {
17-
return calcLightSpecular(ccGlossiness, ccNormalW, vec3(ccSpecularity), ccLightFresnel);
18-
}
14+
float getLightSpecularCC() {
15+
return calcLightSpecular(ccGlossiness, ccReflDirW);
16+
}

src/graphics/program-lib/chunks/ltc.frag

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ vec2 getLTCLightUV(float tGlossiness, vec3 tNormalW)
125125
return LTC_Uv( tNormalW, dViewDirW, roughness );
126126
}
127127

128+
//used for energy conservation and to modulate specular
129+
vec3 dLTCSpecFres;
130+
#ifdef CLEARCOAT
131+
vec3 ccLTCSpecFres;
132+
#endif
128133
vec3 getLTCLightSpecFres(vec2 uv, vec3 tSpecularity)
129134
{
130135
vec4 t2 = texture2D( areaLightsLutTex2, uv );
@@ -140,11 +145,11 @@ vec3 getLTCLightSpecFres(vec2 uv, vec3 tSpecularity)
140145
void calcLTCLightValues()
141146
{
142147
dLTCUV = getLTCLightUV(dGlossiness, dNormalW);
143-
dLightFresnel = getLTCLightSpecFres(dLTCUV, dSpecularity);
148+
dLTCSpecFres = getLTCLightSpecFres(dLTCUV, dSpecularityNoFres);
144149

145150
#ifdef CLEARCOAT
146151
ccLTCUV = getLTCLightUV(ccGlossiness, ccNormalW);
147-
ccLightFresnel = getLTCLightSpecFres(ccLTCUV, vec3(ccSpecularity));
152+
ccLTCSpecFres = getLTCLightSpecFres(ccLTCUV, vec3(ccSpecularityNoFres));
148153
#endif
149154
}
150155

@@ -407,13 +412,13 @@ float calcRectLightSpecular(vec3 tNormalW, vec2 uv) {
407412
return LTC_EvaluateRect( tNormalW, dViewDirW, vPositionW, mInv, dLTCCoords );
408413
}
409414

410-
vec3 getRectLightSpecular() {
411-
return dLightFresnel * calcRectLightSpecular(dNormalW, dLTCUV);
415+
float getRectLightSpecular() {
416+
return calcRectLightSpecular(dNormalW, dLTCUV);
412417
}
413418

414419
#ifdef CLEARCOAT
415-
vec3 getRectLightSpecularCC() {
416-
return ccLightFresnel * calcRectLightSpecular(ccNormalW, ccLTCUV);
420+
float getRectLightSpecularCC() {
421+
return calcRectLightSpecular(ccNormalW, ccLTCUV);
417422
}
418423
#endif
419424

@@ -422,22 +427,22 @@ float calcDiskLightSpecular(vec3 tNormalW, vec2 uv) {
422427
return LTC_EvaluateDisk( tNormalW, dViewDirW, vPositionW, mInv, dLTCCoords );
423428
}
424429

425-
vec3 getDiskLightSpecular() {
426-
return dLightFresnel * calcDiskLightSpecular(dNormalW, dLTCUV);
430+
float getDiskLightSpecular() {
431+
return calcDiskLightSpecular(dNormalW, dLTCUV);
427432
}
428433

429434
#ifdef CLEARCOAT
430-
vec3 getDiskLightSpecularCC() {
431-
return ccLightFresnel * calcDiskLightSpecular(ccNormalW, ccLTCUV);
435+
float getDiskLightSpecularCC() {
436+
return calcDiskLightSpecular(ccNormalW, ccLTCUV);
432437
}
433438
#endif
434439

435-
vec3 getSphereLightSpecular() {
436-
return dLightFresnel * calcDiskLightSpecular(dNormalW, dLTCUV);
440+
float getSphereLightSpecular() {
441+
return calcDiskLightSpecular(dNormalW, dLTCUV);
437442
}
438443

439444
#ifdef CLEARCOAT
440-
vec3 getSphereLightSpecularCC() {
441-
return ccLightFresnel * calcDiskLightSpecular(ccNormalW, ccLTCUV);
445+
float getSphereLightSpecularCC() {
446+
return calcDiskLightSpecular(ccNormalW, ccLTCUV);
442447
}
443448
#endif

src/graphics/program-lib/chunks/reflectionCC.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
uniform float material_clearCoatReflectivity;
33

44
void addReflectionCC() {
5-
ccReflection += vec4(envBrdf(vec3(ccSpecularity), ccGlossiness, ccNormalW) * calcReflection(ccReflDirW, ccGlossiness), material_clearCoatReflectivity);
5+
ccReflection += vec4(calcReflection(ccReflDirW, ccGlossiness), material_clearCoatReflectivity);
66
}
77
#endif

src/graphics/program-lib/chunks/reflectionCube.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ vec3 calcReflection(vec3 tReflDirW, float tGlossiness) {
1010
}
1111

1212
void addReflection() {
13-
dReflection += vec4(envBrdf(dSpecularity, dGlossiness, dNormalW) * calcReflection(dReflDirW, dGlossiness), material_reflectivity);
13+
dReflection += vec4(calcReflection(dReflDirW, dGlossiness), material_reflectivity);
1414
}

src/graphics/program-lib/chunks/reflectionDpAtlas.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,5 @@ vec3 calcReflection(vec3 tReflDirW, float tGlossiness) {
5353
}
5454

5555
void addReflection() {
56-
dReflection += vec4(envBrdf(dSpecularity, dGlossiness, dNormalW) * calcReflection(dReflDirW, dGlossiness), material_reflectivity);
56+
dReflection += vec4(calcReflection(dReflDirW, dGlossiness), material_reflectivity);
5757
}

src/graphics/program-lib/chunks/reflectionPrefilteredCube.frag

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,6 @@ vec3 calcReflection(vec3 tReflDirW, float tGlossiness) {
5050
return processEnvironment($DECODE(cubeFinal).rgb);
5151
}
5252

53-
void addReflection() {
54-
dReflection += vec4(envBrdf(dSpecularity, dGlossiness, dNormalW) * calcReflection(dReflDirW, dGlossiness), material_reflectivity);
53+
void addReflection() {
54+
dReflection += vec4(calcReflection(dReflDirW, dGlossiness), material_reflectivity);
5555
}

src/graphics/program-lib/chunks/reflectionPrefilteredCubeLod.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ vec3 calcReflection(vec3 tReflDirW, float tGlossiness) {
1919
}
2020

2121
void addReflection() {
22-
dReflection += vec4(envBrdf(dSpecularity, dGlossiness, dNormalW) * calcReflection(dReflDirW, dGlossiness), material_reflectivity);
22+
dReflection += vec4(calcReflection(dReflDirW, dGlossiness), material_reflectivity);
2323
}

src/graphics/program-lib/chunks/reflectionSphere.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ vec3 calcReflection(vec3 tReflDirW, float tGlossiness) {
1515
}
1616

1717
void addReflection() {
18-
dReflection += vec4(envBrdf(dSpecularity, dGlossiness, dNormalW) * calcReflection(dReflDirW, dGlossiness), material_reflectivity);
18+
dReflection += vec4(calcReflection(dReflDirW, dGlossiness), material_reflectivity);
1919
}

src/graphics/program-lib/chunks/reflectionSphereLow.frag

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ vec3 calcReflection(vec3 tReflDirW, float tGlossiness) {
99
}
1010

1111
void addReflection() {
12-
dReflection += vec4(envBrdf(dSpecularity, dGlossiness, dNormalW) * calcReflection(dReflDirW, dGlossiness), material_reflectivity);
12+
dReflection += vec4(calcReflection(dReflDirW, dGlossiness), material_reflectivity);
1313
}

src/graphics/program-lib/chunks/reproject.frag

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -231,17 +231,6 @@ vec3 hemisphereSamplePhong(vec2 uv, float specPow) {
231231
return vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
232232
}
233233

234-
vec3 hemisphereSampleGGX(vec2 uv, float specPow) {
235-
float roughness = 1.0 - (log2(specPow) / 11.0);
236-
float a = roughness * roughness;
237-
238-
float phi = 2.0 * PI * uv.y;
239-
float cosTheta = sqrt((1.0 - uv.x) / (1.0 + (a * a - 1.0) * uv.x));
240-
float sinTheta = sqrt(1.0 - cosTheta * cosTheta);
241-
242-
return vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta);
243-
}
244-
245234
vec4 reproject() {
246235
if (NUM_SAMPLES <= 1) {
247236
// single sample
@@ -274,7 +263,7 @@ vec4 prefilter() {
274263
vec3 result = vec3(0.0);
275264
for (int i=0; i<NUM_SAMPLES; ++i) {
276265
vec2 uv = vec2(float(i) / float(NUM_SAMPLES), rnd(i));
277-
vec3 dir = vecSpace * hemisphereSampleGGX(uv, specularPower()); // NB now lines up with environmental BRDF
266+
vec3 dir = vecSpace * hemisphereSamplePhong(uv, specularPower());
278267
result += DECODE_FUNC(SOURCE_FUNC(dir));
279268
}
280269

0 commit comments

Comments
 (0)