Skip to content

Commit 3ec59c8

Browse files
JohnLKkkchenliming
andauthored
Adding support for Specular-AA (#2141)
* Fixes Issue #2132 * jme3-core:Adding support for Specular-AA * jme3-core:del Specular_Anti_Aliasing2 * jme3-core:update Specular_Anti_Aliasing * jme3-core:update Specular_Anti_Aliasing * jme3-core:add MatParam:Sigma,Kappa * jme3-terrain:Adding support for Specular-AA * jme3-core:update PBRLighting.j3md(with SpecularAA) * jme3-terrain:update PBRTerrain.j3md(with SpecularAA) * jmee-core:remove the "f" suffix * jmee-terrain:remove the "f" suffix * jme3-core:Updated parameter names in PBRLighting.j3md * jme3-terrain:Updated parameter names in PBRTerrain.j3md/AdvacedPBRTerrain.j3md * jme3-core:Updated macro definitions in PBRLighting.j3md * jme3-terrain:Updated macro definitions in PBRTerrain.j3md/AdvancedPBRTerrain.j3md --------- Co-authored-by: chenliming <liming.chen@yingxiong.com>
1 parent a0c8247 commit 3ec59c8

7 files changed

Lines changed: 165 additions & 17 deletions

File tree

jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.frag

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,14 @@ varying vec3 wPosition;
9898
#endif
9999
varying vec3 wNormal;
100100

101+
// Specular-AA
102+
#ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
103+
uniform float m_SpecularAASigma;
104+
#endif
105+
#ifdef SPECULAR_AA_THRESHOLD
106+
uniform float m_SpecularAAKappa;
107+
#endif
108+
101109
#ifdef DISCARD_ALPHA
102110
uniform float m_AlphaDiscardThreshold;
103111
#endif
@@ -247,6 +255,16 @@ void main(){
247255
ao = clamp(ao, 0.0, 1.0);
248256
#endif
249257

258+
#ifdef SPECULAR_AA
259+
float sigma = 1.0;
260+
float kappa = 0.18;
261+
#ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
262+
sigma = m_SpecularAASigma;
263+
#endif
264+
#ifdef SPECULAR_AA_THRESHOLD
265+
kappa = m_SpecularAAKappa;
266+
#endif
267+
#endif
250268
float ndotv = max( dot( normal, viewDir ),0.0);
251269
for( int i = 0;i < NB_LIGHTS; i+=3){
252270
vec4 lightColor = g_LightData[i];
@@ -270,10 +288,18 @@ void main(){
270288
lightDir.xyz = normalize(lightDir.xyz);
271289
vec3 directDiffuse;
272290
vec3 directSpecular;
273-
274-
float hdotv = PBR_ComputeDirectLight(normal, lightDir.xyz, viewDir,
275-
lightColor.rgb, fZero, Roughness, ndotv,
276-
directDiffuse, directSpecular);
291+
292+
#ifdef SPECULAR_AA
293+
float hdotv = PBR_ComputeDirectLightWithSpecularAA(
294+
normal, lightDir.xyz, viewDir,
295+
lightColor.rgb, fZero, Roughness, sigma, kappa, ndotv,
296+
directDiffuse, directSpecular);
297+
#else
298+
float hdotv = PBR_ComputeDirectLight(
299+
normal, lightDir.xyz, viewDir,
300+
lightColor.rgb, fZero, Roughness, ndotv,
301+
directDiffuse, directSpecular);
302+
#endif
277303

278304
vec3 directLighting = diffuseColor.rgb *directDiffuse + directSpecular;
279305

jme3-core/src/main/resources/Common/MatDefs/Light/PBRLighting.j3md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,13 @@ MaterialDef PBR Lighting {
5656
// Parallax/height map
5757
Texture2D ParallaxMap -LINEAR
5858

59+
// Specular-AA
60+
Boolean UseSpecularAA : true
61+
// screen space variance,Use the slider to set the strength of the geometric specular anti-aliasing effect between 0 and 1. Higher values produce a blurrier result with less aliasing.
62+
Float SpecularAASigma
63+
// clamping threshold,Use the slider to set a maximum value for the offset that HDRP subtracts from the smoothness value to reduce artifacts.
64+
Float SpecularAAKappa
65+
5966
//Set to true if parallax map is stored in the alpha channel of the normal map
6067
Boolean PackedNormalParallax
6168

@@ -163,6 +170,9 @@ MaterialDef PBR Lighting {
163170
USE_PACKED_MR: MetallicRoughnessMap
164171
USE_PACKED_SG: SpecularGlossinessMap
165172
SPECULARMAP : SpecularMap
173+
SPECULAR_AA : UseSpecularAA
174+
SPECULAR_AA_SCREEN_SPACE_VARIANCE : SpecularAASigma
175+
SPECULAR_AA_THRESHOLD : SpecularAAKappa
166176
GLOSSINESSMAP : GlossinessMap
167177
NORMAL_TYPE: NormalType
168178
VERTEX_COLOR : UseVertexColor

jme3-core/src/main/resources/Common/ShaderLib/PBR.glsllib

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,22 @@
66
#define NB_PROBES 0
77
#endif
88

9+
// BEGIN-@jhonkkk,Specular AA --------------------------------------------------------------
10+
// see:http://www.jp.square-enix.com/tech/library/pdf/ImprovedGeometricSpecularAA(slides).pdf
11+
// https://docs.unity3d.com/Packages/com.unity.render-pipelines.high-definition@15.0/manual/Geometric-Specular-Anti-Aliasing.html
12+
float Specular_Anti_Aliasing(in vec3 normal, in vec3 half_vector,
13+
float alpha, in float sigma, in float kappa)
14+
{
15+
16+
vec3 dndu = dFdx(normal);
17+
vec3 dndv = dFdy(normal);
18+
float variance = sigma*sigma*(dot(dndu, dndu) + dot(dndv, dndv));
19+
float kernel_roughness = min(kappa, variance);
20+
return sqrt(alpha*alpha + kernel_roughness);
21+
}
22+
// END-@jhonkkk
23+
24+
925
//Specular fresnel computation
1026
vec3 F_Shlick(float vh, vec3 F0){
1127
float fresnelFact = pow(2.0, (-5.55473*vh - 6.98316) * vh);
@@ -34,12 +50,11 @@ vec3 sphericalHarmonics( const in vec3 normal, const vec3 sph[9] ){
3450
return max(result, vec3(0.0));
3551
}
3652

37-
38-
float PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir,
39-
vec3 lightColor, vec3 fZero, float roughness, float ndotv,
53+
// BEGIN-@jhonkkk,todo:Keeping the original PBR_ComputeDirectLight function signature is for backwards compatibility, but this adds an extra internal function call, theoretically here we should use a macro to define Inner_PBR_ComputeDirectLight, or best to calculate alpha externally and directly call the Inner_PBR_ComputeDirectLight function.
54+
float Inner_PBR_ComputeDirectLight(
55+
vec3 normal, vec3 halfVec, vec3 lightDir, vec3 viewDir,
56+
vec3 lightColor, vec3 fZero, float alpha, float ndotv,
4057
out vec3 outDiffuse, out vec3 outSpecular){
41-
// Compute halfway vector.
42-
vec3 halfVec = normalize(lightDir + viewDir);
4358

4459
// Compute ndotl, ndoth, vdoth terms which are needed later.
4560
float ndotl = max( dot(normal, lightDir), 0.0);
@@ -53,8 +68,6 @@ float PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir,
5368

5469
//cook-torrence, microfacet BRDF : http://blog.selfshadow.com/publications/s2013-shading-course/karis/s2013_pbs_epic_notes_v2.pdf
5570

56-
float alpha = roughness * roughness;
57-
5871
//D, GGX normal Distribution function
5972
float alpha2 = alpha * alpha;
6073
float sum = ((ndoth * ndoth) * (alpha2 - 1.0) + 1.0);
@@ -89,6 +102,31 @@ float PBR_ComputeDirectLight(vec3 normal, vec3 lightDir, vec3 viewDir,
89102
return hdotv;
90103
}
91104

105+
float PBR_ComputeDirectLight(
106+
vec3 normal, vec3 lightDir, vec3 viewDir,
107+
vec3 lightColor, vec3 fZero, float roughness, float ndotv,
108+
out vec3 outDiffuse, out vec3 outSpecular){
109+
// Compute halfway vector.
110+
vec3 halfVec = normalize(lightDir + viewDir);
111+
return Inner_PBR_ComputeDirectLight(normal, halfVec, lightDir, viewDir,
112+
lightColor, fZero, roughness * roughness, ndotv,
113+
outDiffuse, outSpecular);
114+
}
115+
116+
float PBR_ComputeDirectLightWithSpecularAA(
117+
vec3 normal, vec3 lightDir, vec3 viewDir,
118+
vec3 lightColor, vec3 fZero, float roughness, float sigma, float kappa, float ndotv,
119+
out vec3 outDiffuse, out vec3 outSpecular){
120+
// Compute halfway vector.
121+
vec3 halfVec = normalize(lightDir + viewDir);
122+
// Specular-AA
123+
float alpha = Specular_Anti_Aliasing(normal, halfVec, roughness * roughness, sigma, kappa);
124+
return Inner_PBR_ComputeDirectLight(normal, halfVec, lightDir, viewDir,
125+
lightColor, fZero, alpha, ndotv,
126+
outDiffuse, outSpecular);
127+
}
128+
// END-@jhonkkk
129+
92130
vec3 integrateBRDFApprox( const in vec3 specular, float roughness, float NoV ){
93131
const vec4 c0 = vec4( -1, -0.0275, -0.572, 0.022 );
94132
const vec4 c1 = vec4( 1, 0.0425, 1.04, -0.04 );

jme3-terrain/src/main/resources/Common/MatDefs/Terrain/AdvancedPBRTerrain.frag

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ varying vec3 lightVec;
1717
varying vec3 inNormal;
1818
varying vec3 wNormal;
1919

20+
// Specular-AA
21+
#ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
22+
uniform float m_SpecularAASigma;
23+
#endif
24+
#ifdef SPECULAR_AA_THRESHOLD
25+
uniform float m_SpecularAAKappa;
26+
#endif
27+
2028
#ifdef DEBUG_VALUES_MODE
2129
uniform int m_DebugValuesMode;
2230
#endif
@@ -485,6 +493,16 @@ void main(){
485493

486494

487495
float ndotv = max( dot( normal, viewDir ),0.0);
496+
#ifdef SPECULAR_AA
497+
float sigma = 1.0;
498+
float kappa = 0.18;
499+
#ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
500+
sigma = m_SpecularAASigma;
501+
#endif
502+
#ifdef SPECULAR_AA_THRESHOLD
503+
kappa = m_SpecularAAKappa;
504+
#endif
505+
#endif
488506
for( int i = 0;i < NB_LIGHTS; i+=3){
489507
vec4 lightColor = g_LightData[i];
490508
vec4 lightData1 = g_LightData[i+1];
@@ -508,9 +526,17 @@ void main(){
508526
vec3 directDiffuse;
509527
vec3 directSpecular;
510528

511-
float hdotv = PBR_ComputeDirectLight(normal, lightDir.xyz, viewDir,
512-
lightColor.rgb, fZero, Roughness, ndotv,
513-
directDiffuse, directSpecular);
529+
#ifdef SPECULAR_AA
530+
float hdotv = PBR_ComputeDirectLightWithSpecularAA(
531+
normal, lightDir.xyz, viewDir,
532+
lightColor.rgb, fZero, Roughness, sigma, kappa, ndotv,
533+
directDiffuse, directSpecular);
534+
#else
535+
float hdotv = PBR_ComputeDirectLight(
536+
normal, lightDir.xyz, viewDir,
537+
lightColor.rgb, fZero, Roughness, ndotv,
538+
directDiffuse, directSpecular);
539+
#endif
514540

515541
vec3 directLighting = diffuseColor.rgb *directDiffuse + directSpecular;
516542

jme3-terrain/src/main/resources/Common/MatDefs/Terrain/AdvancedPBRTerrain.j3md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,13 @@ MaterialDef Advanced PBR Terrain {
2727
// affliction texture splatting & desaturation functionality
2828
Boolean UseTriplanarAfflictionMapping
2929

30+
// Specular-AA
31+
Boolean UseSpecularAA : true
32+
// screen space variance,Use the slider to set the strength of the geometric specular anti-aliasing effect between 0 and 1. Higher values produce a blurrier result with less aliasing.
33+
Float SpecularAASigma
34+
// clamping threshold,Use the slider to set a maximum value for the offset that HDRP subtracts from the smoothness value to reduce artifacts.
35+
Float SpecularAAKappa
36+
3037
Texture2D AfflictionAlphaMap
3138

3239
Texture2D SplatAlbedoMap -LINEAR
@@ -280,6 +287,10 @@ MaterialDef Advanced PBR Terrain {
280287
AFFLICTIONEMISSIVEMAP : SplatEmissiveMap
281288
USE_SPLAT_NOISE : SplatNoiseVar
282289

290+
SPECULAR_AA : UseSpecularAA
291+
SPECULAR_AA_SCREEN_SPACE_VARIANCE : SpecularAASigma
292+
SPECULAR_AA_THRESHOLD : SpecularAAKappa
293+
283294
TRI_PLANAR_MAPPING : useTriPlanarMapping
284295

285296
DISCARD_ALPHA : AlphaDiscardThreshold

jme3-terrain/src/main/resources/Common/MatDefs/Terrain/PBRTerrain.frag

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@ varying vec3 lightVec;
1717
varying vec3 inNormal;
1818
varying vec3 wNormal;
1919

20+
// Specular-AA
21+
#ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
22+
uniform float m_SpecularAASigma;
23+
#endif
24+
#ifdef SPECULAR_AA_THRESHOLD
25+
uniform float m_SpecularAAKappa;
26+
#endif
27+
2028
#ifdef DEBUG_VALUES_MODE
2129
uniform int m_DebugValuesMode;
2230
#endif
@@ -417,6 +425,16 @@ gl_FragColor.rgb = vec3(0.0);
417425

418426

419427
float ndotv = max( dot( normal, viewDir ),0.0);
428+
#ifdef SPECULAR_AA
429+
float sigma = 1.0;
430+
float kappa = 0.18;
431+
#ifdef SPECULAR_AA_SCREEN_SPACE_VARIANCE
432+
sigma = m_SpecularAASigma;
433+
#endif
434+
#ifdef SPECULAR_AA_THRESHOLD
435+
kappa = m_SpecularAAKappa;
436+
#endif
437+
#endif
420438
for( int i = 0;i < NB_LIGHTS; i+=3){
421439
vec4 lightColor = g_LightData[i];
422440
vec4 lightData1 = g_LightData[i+1];
@@ -440,9 +458,17 @@ gl_FragColor.rgb = vec3(0.0);
440458
vec3 directDiffuse;
441459
vec3 directSpecular;
442460

443-
float hdotv = PBR_ComputeDirectLight(normal, lightDir.xyz, viewDir,
444-
lightColor.rgb, fZero, Roughness, ndotv,
445-
directDiffuse, directSpecular);
461+
#ifdef SPECULAR_AA
462+
float hdotv = PBR_ComputeDirectLightWithSpecularAA(
463+
normal, lightDir.xyz, viewDir,
464+
lightColor.rgb, fZero, Roughness, sigma, kappa, ndotv,
465+
directDiffuse, directSpecular);
466+
#else
467+
float hdotv = PBR_ComputeDirectLight(
468+
normal, lightDir.xyz, viewDir,
469+
lightColor.rgb, fZero, Roughness, ndotv,
470+
directDiffuse, directSpecular);
471+
#endif
446472

447473
vec3 directLighting = diffuseColor.rgb *directDiffuse + directSpecular;
448474

jme3-terrain/src/main/resources/Common/MatDefs/Terrain/PBRTerrain.j3md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ MaterialDef PBR Terrain {
2424
Texture2D SplatRoughnessMetallicMap -LINEAR
2525
Texture2D SplatEmissiveMap -LINEAR
2626

27+
// Specular-AA
28+
Boolean UseSpecularAA : true
29+
// screen space variance,Use the slider to set the strength of the geometric specular anti-aliasing effect between 0 and 1. Higher values produce a blurrier result with less aliasing.
30+
Float SpecularAASigma
31+
// clamping threshold,Use the slider to set a maximum value for the offset that HDRP subtracts from the smoothness value to reduce artifacts.
32+
Float SpecularAAKappa
33+
2734
Color AfflictionEmissiveColor : 0.0 0.0 0.0 0.0
2835

2936
Float SplatNoiseVar
@@ -256,6 +263,10 @@ MaterialDef PBR Terrain {
256263

257264
USE_SPLAT_NOISE : SplatNoiseVar
258265

266+
SPECULAR_AA : UseSpecularAA
267+
SPECULAR_AA_SCREEN_SPACE_VARIANCE : SpecularAASigma
268+
SPECULAR_AA_THRESHOLD : SpecularAAKappa
269+
259270

260271
USE_VERTEX_COLORS_AS_SUN_INTENSITY : UseVertexColorsAsSunIntensity
261272
STATIC_SUN_INTENSITY : StaticSunIntensity

0 commit comments

Comments
 (0)