From 4ae23695fb20b66e8d7c715624f480290461e79e Mon Sep 17 00:00:00 2001 From: Gernot Steinegger Date: Sat, 30 Dec 2023 19:28:27 +0100 Subject: [PATCH 1/5] examples: post-processing material AO --- .../en/postprocessing/EffectComposer.html | 1 + .../zh/postprocessing/EffectComposer.html | 1 + examples/files.json | 1 + .../materials/MeshPostProcessingMaterial.js | 116 +++++++ examples/jsm/postprocessing/GTAOPass.js | 10 + .../webgl_postprocessing_material_ao.jpg | Bin 0 -> 20579 bytes examples/tags.json | 1 + .../webgl_postprocessing_material_ao.html | 327 ++++++++++++++++++ 8 files changed, 457 insertions(+) create mode 100644 examples/jsm/materials/MeshPostProcessingMaterial.js create mode 100644 examples/screenshots/webgl_postprocessing_material_ao.jpg create mode 100644 examples/webgl_postprocessing_material_ao.html diff --git a/docs/examples/en/postprocessing/EffectComposer.html b/docs/examples/en/postprocessing/EffectComposer.html index 9531cfc4561992..db75f3f86ee10d 100644 --- a/docs/examples/en/postprocessing/EffectComposer.html +++ b/docs/examples/en/postprocessing/EffectComposer.html @@ -41,6 +41,7 @@

Examples

[example:webgl_postprocessing_godrays postprocessing godrays]
[example:webgl_postprocessing_gtao postprocessing gtao]
[example:webgl_postprocessing_masking postprocessing masking]
+ [example:webgl_postprocessing_material_ao postprocessing material ao]
[example:webgl_postprocessing_outline postprocessing outline]
[example:webgl_postprocessing_pixel postprocessing pixelate]
[example:webgl_postprocessing_procedural postprocessing procedural]
diff --git a/docs/examples/zh/postprocessing/EffectComposer.html b/docs/examples/zh/postprocessing/EffectComposer.html index 6d480877cc04e5..33d2aac17112d0 100644 --- a/docs/examples/zh/postprocessing/EffectComposer.html +++ b/docs/examples/zh/postprocessing/EffectComposer.html @@ -40,6 +40,7 @@

例子

[example:webgl_postprocessing_godrays postprocessing godrays]
[example:webgl_postprocessing_gtao postprocessing gtao]
[example:webgl_postprocessing_masking postprocessing masking]
+ [example:webgl_postprocessing_material_ao postprocessing material ao]
[example:webgl_postprocessing_outline postprocessing outline]
[example:webgl_postprocessing_pixel postprocessing pixelate]
[example:webgl_postprocessing_procedural postprocessing procedural]
diff --git a/examples/files.json b/examples/files.json index 63efedff6746fe..28087dc28c46ee 100644 --- a/examples/files.json +++ b/examples/files.json @@ -249,6 +249,7 @@ "webgl_postprocessing_gtao", "webgl_postprocessing_rgb_halftone", "webgl_postprocessing_masking", + "webgl_postprocessing_material_ao", "webgl_postprocessing_ssaa", "webgl_postprocessing_outline", "webgl_postprocessing_pixel", diff --git a/examples/jsm/materials/MeshPostProcessingMaterial.js b/examples/jsm/materials/MeshPostProcessingMaterial.js new file mode 100644 index 00000000000000..25b7d5ebd60e55 --- /dev/null +++ b/examples/jsm/materials/MeshPostProcessingMaterial.js @@ -0,0 +1,116 @@ +import { MeshPhysicalMaterial } from 'three'; + +/** + * The aim of this mesh material is to use information from a post processing pass in the diffuse color pass. + * This material is based on the MeshPhysicalMaterial. + * + * In the current state, only the information of a screen space AO pass can be used in the material. + * Actually, the output of any screen space AO (SSAO, GTAO) can be used, + * as it is only necessary to provide the AO in one color channel of a texture, + * however the AO pass must be rendered prior to the color pass, + * which makes the post-processing pass somewhat of a pre-processing pass. + * Fot this purpose a new map (`aoPassMap`) is added to the material. + * The value of the map is used the same way as the `aoMap` value. + * + * Motivation to use the outputs AO pass directly in the material: + * The incident light of a fragment is composed of ambient light, direct light and indirect light + * Ambient Occlusion only occludes ambient light and environment light, but not direct light. + * Direct light is only occluded by geometry that casts shadows. + * And of course the emitted light should not be darkened by ambient occlusion either. + * This cannot be achieved if the AO post processing pass is simply blended with the diffuse render pass. + * + * Further extension work might be to use the output of an SSR pass or an HBIL pass from a previous frame. + * This would then create the possibility of SSR and IR depending on material properties such as `roughness`, `metalness` and `reflectivity`. +**/ + +class MeshPostProcessingMaterial extends MeshPhysicalMaterial { + + constructor( parameters ) { + + const aoPassMap = parameters.aoPassMap; + delete parameters.aoPassMap; + super( parameters ); + + this.onBeforeCompile = this._onBeforeCompile; + this._aoPassMap = aoPassMap; + + } + + get aoPassMap() { + + return this._aoPassMap; + + } + + set aoPassMap( aoPassMap ) { + + this._aoPassMap = aoPassMap; + this.needsUpdate = true; + + } + + _onBeforeCompile( shader ) { + + if ( this._aoPassMap !== undefined ) { + + shader.vertexShader = shader.vertexShader.replace( + '#include ', + `varying vec4 vClipSpacePosition; + #include ` + ); + shader.vertexShader = shader.vertexShader.replace( + '#include ', + `#include + vClipSpacePosition = gl_Position;` + ); + shader.fragmentShader = shader.fragmentShader.replace( + '#include ', + `varying vec4 vClipSpacePosition; + uniform sampler2D tAoPassMap; + #include ` + ); + shader.fragmentShader = shader.fragmentShader.replace( + '#include ', + aomap_fragment_replacement + ); + shader.uniforms.tAoPassMap = { value: this._aoPassMap }; + + } + + } + +} + +const aomap_fragment_replacement = /* glsl */` +#ifndef AOPASSMAP_SWIZZLE + #define AOPASSMAP_SWIZZLE r +#endif + float ambientOcclusion = texture2D( tAoPassMap, vClipSpacePosition.xy / vClipSpacePosition.w * 0.5 + 0.5 ).AOPASSMAP_SWIZZLE; + +#ifdef USE_AOMAP + + // reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture + ambientOcclusion *= ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0; + +#endif + + reflectedLight.indirectDiffuse *= ambientOcclusion; + + #if defined( USE_CLEARCOAT ) + clearcoatSpecularIndirect *= ambientOcclusion; + #endif + + #if defined( USE_SHEEN ) + sheenSpecularIndirect *= ambientOcclusion; + #endif + + #if defined( USE_ENVMAP ) && defined( STANDARD ) + + float dotNV = saturate( dot( geometryNormal, geometryViewDir ) ); + + reflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness ); + + #endif +`; + +export { MeshPostProcessingMaterial }; diff --git a/examples/jsm/postprocessing/GTAOPass.js b/examples/jsm/postprocessing/GTAOPass.js index 14a06338a48a26..ad0a76214bbcbc 100644 --- a/examples/jsm/postprocessing/GTAOPass.js +++ b/examples/jsm/postprocessing/GTAOPass.js @@ -162,6 +162,12 @@ class GTAOPass extends Pass { } + get gtaoMap() { + + return this.pdRenderTarget.texture; + + } + setGBuffer( depthTexture, normalTexture ) { if ( depthTexture !== undefined ) { @@ -359,6 +365,9 @@ class GTAOPass extends Pass { switch ( this.output ) { + case GTAOPass.OUTPUT.Off: + break; + case GTAOPass.OUTPUT.Diffuse: this.copyMaterial.uniforms.tDiffuse.value = readBuffer.texture; @@ -561,6 +570,7 @@ class GTAOPass extends Pass { } GTAOPass.OUTPUT = { + 'Off': - 1, 'Default': 0, 'Diffuse': 1, 'Depth': 2, diff --git a/examples/screenshots/webgl_postprocessing_material_ao.jpg b/examples/screenshots/webgl_postprocessing_material_ao.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7614788d98eef74c0aa6e8e1844f088f7b391b6c GIT binary patch literal 20579 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 literal 0 HcmV?d00001 diff --git a/examples/tags.json b/examples/tags.json index a5bf7deca1fb33..540e1e3c2809ea 100644 --- a/examples/tags.json +++ b/examples/tags.json @@ -88,6 +88,7 @@ "webgl_postprocessing_fxaa": [ "msaa", "multisampled" ], "webgl_postprocessing_godrays": [ "light scattering" ], "webgl_postprocessing_gtao": [ "ambient occlusion" ], + "webgl_postprocessing_material_ao": [ "ambient occlusion"], "webgl_shadowmap_progressive": [ "shadow", "soft", "lightmap", "onBeforeCompile" ], "webgl_postprocessing_ssaa": [ "msaa", "multisampled" ], "webgl_postprocessing_ssaa_unbiased": [ "msaa", "multisampled" ], diff --git a/examples/webgl_postprocessing_material_ao.html b/examples/webgl_postprocessing_material_ao.html new file mode 100644 index 00000000000000..6045e5559209b5 --- /dev/null +++ b/examples/webgl_postprocessing_material_ao.html @@ -0,0 +1,327 @@ + + + + three.js webgl - postprocessing - GTAO + + + + + + +
+ three.js - Mesh Post Processing Material by Rabbid76
+

left side: blend GTAO with final diffuse color buffer - right side: apply GTAO to ambient and environment light in mesh material

+
+ +
+
+
+ + + + + + From 7819ad8f792ecc1b6c8434762d8c1ea9db5826d7 Mon Sep 17 00:00:00 2001 From: Gernot Steinegger Date: Sun, 31 Dec 2023 11:38:11 +0100 Subject: [PATCH 2/5] examples: postprocessing material - use gl_FragCoord.xy for map lookup --- .../materials/MeshPostProcessingMaterial.js | 38 ++++++++++-------- .../webgl_postprocessing_material_ao.jpg | Bin 20579 -> 20554 bytes 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/examples/jsm/materials/MeshPostProcessingMaterial.js b/examples/jsm/materials/MeshPostProcessingMaterial.js index 25b7d5ebd60e55..415e0496857955 100644 --- a/examples/jsm/materials/MeshPostProcessingMaterial.js +++ b/examples/jsm/materials/MeshPostProcessingMaterial.js @@ -28,11 +28,15 @@ class MeshPostProcessingMaterial extends MeshPhysicalMaterial { constructor( parameters ) { const aoPassMap = parameters.aoPassMap; + const aoPassMapScale = parameters.aoPassMapScale || 1.0; delete parameters.aoPassMap; + delete parameters.aoPassMapScale; + super( parameters ); this.onBeforeCompile = this._onBeforeCompile; this._aoPassMap = aoPassMap; + this.aoPassMapScale = aoPassMapScale; } @@ -53,27 +57,16 @@ class MeshPostProcessingMaterial extends MeshPhysicalMaterial { if ( this._aoPassMap !== undefined ) { - shader.vertexShader = shader.vertexShader.replace( - '#include ', - `varying vec4 vClipSpacePosition; - #include ` - ); - shader.vertexShader = shader.vertexShader.replace( - '#include ', - `#include - vClipSpacePosition = gl_Position;` - ); shader.fragmentShader = shader.fragmentShader.replace( - '#include ', - `varying vec4 vClipSpacePosition; - uniform sampler2D tAoPassMap; - #include ` + '#include ', + aomap_pars_fragment_replacement ); shader.fragmentShader = shader.fragmentShader.replace( '#include ', aomap_fragment_replacement ); shader.uniforms.tAoPassMap = { value: this._aoPassMap }; + shader.uniforms.aoPassMapScale = { value: this.aoPassMapScale }; } @@ -81,16 +74,29 @@ class MeshPostProcessingMaterial extends MeshPhysicalMaterial { } +const aomap_pars_fragment_replacement = /* glsl */` +#ifdef USE_AOMAP + + uniform sampler2D aoMap; + uniform float aoMapIntensity; + +#endif + + uniform sampler2D tAoPassMap; + uniform float aoPassMapScale; +`; + const aomap_fragment_replacement = /* glsl */` #ifndef AOPASSMAP_SWIZZLE #define AOPASSMAP_SWIZZLE r #endif - float ambientOcclusion = texture2D( tAoPassMap, vClipSpacePosition.xy / vClipSpacePosition.w * 0.5 + 0.5 ).AOPASSMAP_SWIZZLE; + float ambientOcclusion = texelFetch( tAoPassMap, ivec2( gl_FragCoord.xy * aoPassMapScale ), 0 ).AOPASSMAP_SWIZZLE; #ifdef USE_AOMAP // reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture - ambientOcclusion *= ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0; + ambientOcclusion = min( ambientOcclusion, texture2D( aoMap, vAoMapUv ).r ); + ambientOcclusion *= ( ambientOcclusion - 1.0 ) * aoMapIntensity + 1.0; #endif diff --git a/examples/screenshots/webgl_postprocessing_material_ao.jpg b/examples/screenshots/webgl_postprocessing_material_ao.jpg index 7614788d98eef74c0aa6e8e1844f088f7b391b6c..75cd3348c2418ead34410439d3894535afbd6bf4 100644 GIT binary patch delta 15618 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 GDKGrA1pDaiQPTpA-lwCbO5 z!@2-V42iGJD6FR)iRmH(1vyD&*#5QE5V!gQ|D8o)*3&%|FBrk_MBa6-t1&IGDkWJc zNF@K)4A)-P%7$vj=B1`u@|K5e%3=@VO@Zwlh$D*=X2LE%8n0Jl6E zFFa!TnC}|>cuR)*tHObPnBK%ks%t5;+rNY6Y-G73ZF+WmTY9h#H{!FJK45_nh_E;+ z-x{F9p?&@u9Z4r_$aB`N)yUD1*ho;%dj~rDIRgx{0*6tzf)MS31=2INrs=cer@Q9> z=h*Xq-4?h-sC!83i7njUCcU;J3Dl#fLzDSY)F*Ke>P`?>Ip2u_}?_ zjH*`)9e?{KQEp+QO3lfYNt^Tg4AD$|dRvvce4j>4ElJ|PPnRj)+ZZ6RP>SVq#?r6< znh~De?!Ui%R??-z^naX=HBh9C(md2v8;e$4=lu+mneG4gEMNVMUL!S>Hh LC1QGbH}n4hl$KUc delta 15727 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 AyZ`_I From 8c8013b202aa6185f4c3f600f5e1574bd40c16e0 Mon Sep 17 00:00:00 2001 From: Gernot Steinegger Date: Sun, 31 Dec 2023 16:07:44 +0100 Subject: [PATCH 3/5] Examples: postprocessing material ao: show diffuse pass on both sides --- .../materials/MeshPostProcessingMaterial.js | 28 +++++++++++++++++-- .../webgl_postprocessing_material_ao.html | 6 ++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/examples/jsm/materials/MeshPostProcessingMaterial.js b/examples/jsm/materials/MeshPostProcessingMaterial.js index 415e0496857955..d2fa48f9cbc46d 100644 --- a/examples/jsm/materials/MeshPostProcessingMaterial.js +++ b/examples/jsm/materials/MeshPostProcessingMaterial.js @@ -35,8 +35,10 @@ class MeshPostProcessingMaterial extends MeshPhysicalMaterial { super( parameters ); this.onBeforeCompile = this._onBeforeCompile; + this.customProgramCacheKey = this._customProgramCacheKey; this._aoPassMap = aoPassMap; this.aoPassMapScale = aoPassMapScale; + this._shader = null; } @@ -50,12 +52,21 @@ class MeshPostProcessingMaterial extends MeshPhysicalMaterial { this._aoPassMap = aoPassMap; this.needsUpdate = true; + this._setUniforms(); + + } + + _customProgramCacheKey() { + + return this._aoPassMap !== undefined && this._aoPassMap !== null ? 'aoPassMap' : ''; } _onBeforeCompile( shader ) { - if ( this._aoPassMap !== undefined ) { + this._shader = shader; + + if ( this._aoPassMap !== undefined && this._aoPassMap !== null ) { shader.fragmentShader = shader.fragmentShader.replace( '#include ', @@ -65,8 +76,19 @@ class MeshPostProcessingMaterial extends MeshPhysicalMaterial { '#include ', aomap_fragment_replacement ); - shader.uniforms.tAoPassMap = { value: this._aoPassMap }; - shader.uniforms.aoPassMapScale = { value: this.aoPassMapScale }; + + } + + this._setUniforms(); + + } + + _setUniforms() { + + if ( this._shader ) { + + this._shader.uniforms.tAoPassMap = { value: this._aoPassMap }; + this._shader.uniforms.aoPassMapScale = { value: this.aoPassMapScale }; } diff --git a/examples/webgl_postprocessing_material_ao.html b/examples/webgl_postprocessing_material_ao.html index 6045e5559209b5..b29acb0730817b 100644 --- a/examples/webgl_postprocessing_material_ao.html +++ b/examples/webgl_postprocessing_material_ao.html @@ -215,14 +215,16 @@ const gui = new GUI(); gui.add( gtaoPasses[ 0 ], 'output', { 'Default': GTAOPass.OUTPUT.Default, - 'Diffuse (right side)': GTAOPass.OUTPUT.Diffuse, + 'Diffuse': GTAOPass.OUTPUT.Diffuse, 'AO': GTAOPass.OUTPUT.Denoise, } ).onChange( function ( value ) { gtaoPasses[ 0 ].output = value; gtaoPasses[ 1 ].output = value === GTAOPass.OUTPUT.Denoise ? value : GTAOPass.OUTPUT.Off; - renderPasses[ 1 ].enabled = value !== GTAOPass.OUTPUT.Denoise; + renderPasses.forEach( pass => pass.enabled = value !== GTAOPass.OUTPUT.Denoise ); + groundMaterials[ 1 ].aoPassMap = value === GTAOPass.OUTPUT.Default ? gtaoPasses[ 1 ].gtaoMap : null; + objectMaterials[ 1 ].aoPassMap = value === GTAOPass.OUTPUT.Default ? gtaoPasses[ 1 ].gtaoMap : null; } ); gui.add( sceneParameters, 'envMapIntensity' ).min( 0 ).max( 1 ).step( 0.01 ).onChange( () => { From df166789c11e7e779e908e617b5d8dd4a93ab3c0 Mon Sep 17 00:00:00 2001 From: Gernot Steinegger Date: Tue, 2 Jan 2024 10:56:12 +0100 Subject: [PATCH 4/5] Examples: postprocessing material a - simplify example --- .../webgl_postprocessing_material_ao.jpg | Bin 20554 -> 20540 bytes .../webgl_postprocessing_material_ao.html | 279 ++++++++---------- 2 files changed, 115 insertions(+), 164 deletions(-) diff --git a/examples/screenshots/webgl_postprocessing_material_ao.jpg b/examples/screenshots/webgl_postprocessing_material_ao.jpg index 75cd3348c2418ead34410439d3894535afbd6bf4..210f06ddbe9577fcfa7ef82d0950fe6c1a279eee 100644 GIT binary patch delta 18175 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 Q7|rT7sF0HZ2_*vm*=>@oy8r+H delta 18194 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 diff --git a/examples/webgl_postprocessing_material_ao.html b/examples/webgl_postprocessing_material_ao.html index b29acb0730817b..66b21c7eeddb69 100644 --- a/examples/webgl_postprocessing_material_ao.html +++ b/examples/webgl_postprocessing_material_ao.html @@ -13,29 +13,12 @@ a { color: #2983ff; } - .splitSlider { - position: absolute; - cursor: ew-resize; - - width: 40px; - height: 40px; - background-color: #F32196; - opacity: 0.7; - border-radius: 50%; - - top: calc(50% - 20px); - left: calc(50% - 20px); - }
three.js - Mesh Post Processing Material by Rabbid76
-

left side: blend GTAO with final diffuse color buffer - right side: apply GTAO to ambient and environment light in mesh material

-
- -
-
+

Improved application of the AO passes by using the AO directly in the material shader instead of simply blending with the whole scene