three-base 2.0.137 → 2.0.145
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/DirectionalLight.d.ts +2 -2
- package/DirectionalLight.js +1 -1
- package/DirectionalLight.ts +70 -0
- package/EventMap.d.ts +103 -0
- package/EventMap.js +17 -0
- package/EventMap.ts +139 -0
- package/EventMesh.ts +60 -0
- package/ExtrudeMesh.js +1 -25
- package/ExtrudeMesh.ts +553 -0
- package/FPScontrol.d.ts +448 -15
- package/FPScontrol.js +1448 -266
- package/FPScontrol.ts +1855 -0
- package/Fire/Fire.d.ts +4 -4
- package/Fire/Fire.js +8 -7
- package/Fire/Fire.ts +89 -0
- package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +2 -2
- package/Fire/{FireGromtry.js → FireGeometry.js} +1 -1
- package/Fire/FireGeometry.ts +40 -0
- package/Fire/FireMaterial.d.ts +3 -3
- package/Fire/FireMaterial.js +1 -1
- package/Fire/FireMaterial.ts +89 -0
- package/Fire/index.d.ts +1 -0
- package/Fire/index.js +1 -0
- package/Fire/index.ts +2 -0
- package/GLTFDracoLoader.d.ts +71 -0
- package/GLTFDracoLoader.js +266 -0
- package/GLTFDracoLoader.ts +430 -0
- package/Grass/Grass.d.ts +2 -2
- package/Grass/Grass.ts +38 -0
- package/Grass/index.d.ts +1 -0
- package/Grass/index.js +1 -0
- package/Grass/index.ts +2 -0
- package/Ground1/Ground1.d.ts +2 -3
- package/Ground1/Ground1.js +64 -60
- package/Ground1/Ground1.ts +114 -0
- package/Ground1/index.ts +1 -0
- package/MeshBase.d.ts +1 -0
- package/MeshBase.js +37 -13
- package/MeshBase.ts +253 -0
- package/Mirror.d.ts +3 -3
- package/Mirror.js +7 -3
- package/Mirror.ts +203 -0
- package/MktMesh/MktMesh.d.ts +301 -0
- package/MktMesh/MktMesh.js +1064 -0
- package/MktMesh/MktMesh.ts +1096 -0
- package/MktMesh/assetUrl.d.ts +59 -0
- package/MktMesh/assetUrl.js +154 -0
- package/MktMesh/assetUrl.ts +155 -0
- package/MktMesh/mktMappingShader.d.ts +12 -0
- package/MktMesh/mktMappingShader.js +139 -0
- package/MktMesh/mktMappingShader.ts +139 -0
- package/MktMesh/mktShader.d.ts +263 -0
- package/MktMesh/mktShader.js +1248 -0
- package/MktMesh/mktShader.ts +1344 -0
- package/MktMesh/panoBitmapTexture.d.ts +25 -0
- package/MktMesh/panoBitmapTexture.js +52 -0
- package/MktMesh/panoBitmapTexture.ts +54 -0
- package/MktMesh/panoSlotBind.d.ts +29 -0
- package/MktMesh/panoSlotBind.js +106 -0
- package/MktMesh/panoSlotBind.ts +153 -0
- package/MktMesh/panoSlotRoster.d.ts +22 -0
- package/MktMesh/panoSlotRoster.js +169 -0
- package/MktMesh/panoSlotRoster.ts +168 -0
- package/MktMesh/panoTileStitcher.d.ts +119 -0
- package/MktMesh/panoTileStitcher.js +533 -0
- package/MktMesh/panoTileStitcher.ts +616 -0
- package/MktMesh/types.d.ts +75 -0
- package/MktMesh/types.js +1 -0
- package/MktMesh/types.ts +87 -0
- package/MktMesh/wallCapTessellate.d.ts +33 -0
- package/MktMesh/wallCapTessellate.js +97 -0
- package/MktMesh/wallCapTessellate.ts +68 -0
- package/PipeMesh/PathGeometry.js +9 -2
- package/PipeMesh/PathGeometry.ts +343 -0
- package/PipeMesh/PathPoint.ts +36 -0
- package/PipeMesh/PathPointList.js +1 -0
- package/PipeMesh/PathPointList.ts +227 -0
- package/PipeMesh/PathTubeGeometry.ts +146 -0
- package/PipeMesh/PipeMesh.d.ts +1 -1
- package/PipeMesh/PipeMesh.js +1 -1
- package/PipeMesh/PipeMesh.ts +76 -0
- package/PipeMesh/index.ts +1 -0
- package/PlaneModal1/PlaneModal1.d.ts +16 -13
- package/PlaneModal1/PlaneModal1.js +4 -0
- package/PlaneModal1/PlaneModal1.ts +138 -0
- package/PlaneModal1/index.ts +1 -0
- package/PlaneText.d.ts +2 -14
- package/PlaneText.js +7 -2
- package/PlaneText.ts +55 -0
- package/PlaneWithHtml.d.ts +4 -2
- package/PlaneWithHtml.js +2 -1
- package/PlaneWithHtml.ts +70 -0
- package/PointLight/PointLight.d.ts +3 -4
- package/PointLight/PointLight.js +1 -7
- package/PointLight/PointLight.ts +67 -0
- package/PointLight/index.ts +1 -0
- package/README.md +110 -79
- package/Sky/Sky.ts +22 -0
- package/Sky/index.ts +1 -0
- package/SpotLight.d.ts +2 -2
- package/SpotLight.js +1 -1
- package/SpotLight.ts +74 -0
- package/SpriteModal1/SpriteModal1.d.ts +16 -13
- package/SpriteModal1/SpriteModal1.js +8 -2
- package/SpriteModal1/SpriteModal1.ts +146 -0
- package/SpriteModal1/index.ts +1 -0
- package/SpriteText.d.ts +14 -13
- package/SpriteText.js +22 -9
- package/SpriteText.ts +205 -0
- package/SpriteText2.d.ts +9 -8
- package/SpriteText2.js +57 -32
- package/SpriteText2.ts +258 -0
- package/SpriteText3.d.ts +86 -0
- package/SpriteText3.js +519 -0
- package/SpriteText3.ts +599 -0
- package/SpriteWithHtml.d.ts +4 -2
- package/SpriteWithHtml.ts +50 -0
- package/Text3D/Text3D.js +17 -21
- package/Text3D/Text3D.ts +77 -0
- package/Text3D/fontController.d.ts +10 -9
- package/Text3D/fontController.js +17 -50
- package/Text3D/fontController.ts +209 -0
- package/Text3D/index.ts +1 -0
- package/ThreeBase.d.ts +168 -31
- package/ThreeBase.js +663 -117
- package/ThreeBase.ts +1314 -0
- package/ThreeMouse.d.ts +20 -7
- package/ThreeMouse.js +78 -32
- package/ThreeMouse.ts +472 -0
- package/Transition.d.ts +12 -7
- package/Transition.js +26 -27
- package/Transition.ts +242 -0
- package/Water/Water.js +21 -3
- package/Water/Water.ts +45 -0
- package/Water/index.d.ts +2 -0
- package/Water/index.js +2 -0
- package/Water/index.ts +2 -0
- package/WaterFlow/FloatingDuck.d.ts +88 -0
- package/WaterFlow/FloatingDuck.js +307 -0
- package/WaterFlow/FloatingDuck.ts +445 -0
- package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
- package/WaterFlow/GPUFluidSimulation.js +785 -0
- package/WaterFlow/GPUFluidSimulation.ts +827 -0
- package/WaterFlow/ReservoirSystem.d.ts +106 -0
- package/WaterFlow/ReservoirSystem.js +621 -0
- package/WaterFlow/ReservoirSystem.ts +754 -0
- package/WaterFlow/SPHField.d.ts +35 -0
- package/WaterFlow/SPHField.js +204 -0
- package/WaterFlow/SPHField.ts +228 -0
- package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
- package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
- package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
- package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
- package/WaterFlow/ShallowWaterSurface.js +441 -0
- package/WaterFlow/ShallowWaterSurface.ts +510 -0
- package/WaterFlow/WaterFlow.d.ts +87 -0
- package/WaterFlow/WaterFlow.js +171 -0
- package/WaterFlow/WaterFlow.ts +219 -0
- package/WaterFlow/types.d.ts +161 -0
- package/WaterFlow/types.js +1 -0
- package/WaterFlow/types.ts +189 -0
- package/WaterFlow/waterFlowPass.d.ts +3 -0
- package/WaterFlow/waterFlowPass.js +20 -0
- package/WaterFlow/waterFlowPass.ts +40 -0
- package/collisionOBB.d.ts +42 -0
- package/collisionOBB.js +112 -0
- package/collisionOBB.ts +108 -0
- package/declare.d.ts +25 -167
- package/index.js +0 -1
- package/index.ts +1 -0
- package/instanced/InstancedBatch.d.ts +57 -0
- package/instanced/InstancedBatch.js +348 -0
- package/instanced/InstancedBatch.ts +406 -0
- package/instanced/InstancedChild.d.ts +174 -0
- package/instanced/InstancedChild.js +264 -0
- package/instanced/InstancedChild.ts +327 -0
- package/instanced/InstancedGroup.d.ts +43 -0
- package/instanced/InstancedGroup.js +126 -0
- package/instanced/InstancedGroup.ts +137 -0
- package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +6 -7
- package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +36 -47
- package/instanced/InstancedMeshBase.ts +292 -0
- package/instanced/InstancedTemplate.d.ts +46 -0
- package/instanced/InstancedTemplate.js +125 -0
- package/instanced/InstancedTemplate.ts +188 -0
- package/keyControls.d.ts +29 -0
- package/{keyContorls.js → keyControls.js} +10 -7
- package/keyControls.ts +107 -0
- package/lensflare/LensFlare.d.ts +39 -0
- package/lensflare/LensFlare.js +373 -0
- package/lensflare/LensFlare.ts +448 -0
- package/lensflare/lensflare0.png +0 -0
- package/lensflare/lensflare3.png +0 -0
- package/lensflare/lensflare_custom.png +0 -0
- package/lensflare/lensflare_hex_ghost.png +0 -0
- package/lensflare/lensflare_hex_main.png +0 -0
- package/package.json +104 -25
- package/pass/bloom_pass.d.ts +1 -1
- package/pass/bloom_pass.js +127 -40
- package/pass/bloom_pass.ts +243 -0
- package/pass/cover_pass.d.ts +1 -1
- package/pass/cover_pass.js +55 -32
- package/pass/cover_pass.ts +182 -0
- package/pass/debugDepthState.d.ts +20 -0
- package/pass/debugDepthState.js +9 -0
- package/pass/debugDepthState.ts +22 -0
- package/pass/depthTestBias.d.ts +12 -0
- package/pass/depthTestBias.js +12 -0
- package/pass/depthTestBias.ts +12 -0
- package/pass/effectUserData.d.ts +27 -0
- package/pass/effectUserData.js +1 -0
- package/pass/effectUserData.ts +46 -0
- package/pass/frosted_glass_pass.d.ts +1 -1
- package/pass/frosted_glass_pass.js +45 -64
- package/pass/frosted_glass_pass.ts +288 -0
- package/pass/fsQuad.d.ts +2 -2
- package/pass/fsQuad.ts +34 -0
- package/pass/glow_pass.d.ts +1 -1
- package/pass/glow_pass.js +288 -72
- package/pass/glow_pass.ts +654 -0
- package/pass/screen_bloom_pass.d.ts +11 -0
- package/pass/screen_bloom_pass.js +235 -0
- package/pass/screen_bloom_pass.ts +263 -0
- package/pass/ssao_pass.d.ts +78 -3
- package/pass/ssao_pass.js +642 -206
- package/pass/ssao_pass.ts +918 -0
- package/pass/stroke_pass.d.ts +1 -1
- package/pass/stroke_pass.js +187 -116
- package/pass/stroke_pass.ts +638 -0
- package/shaders/FXAAShaderMaterial.js +5 -48
- package/shaders/FXAAShaderMaterial.ts +201 -0
- package/shaders/baseDepthVisShader.d.ts +11 -0
- package/shaders/baseDepthVisShader.js +36 -0
- package/shaders/baseDepthVisShader.ts +36 -0
- package/shaders/baseTextureToRenderShader.js +46 -51
- package/shaders/baseTextureToRenderShader.ts +232 -0
- package/shaders/copyShader.js +2 -3
- package/shaders/copyShader.ts +32 -0
- package/shaders/debugDepthCompareShader.d.ts +14 -0
- package/shaders/debugDepthCompareShader.js +49 -0
- package/shaders/debugDepthCompareShader.ts +50 -0
- package/shaders/debugDepthJudgeShader.d.ts +18 -0
- package/shaders/debugDepthJudgeShader.js +52 -0
- package/shaders/debugDepthJudgeShader.ts +54 -0
- package/shaders/debugExcludedShader.d.ts +13 -0
- package/shaders/debugExcludedShader.js +46 -0
- package/shaders/debugExcludedShader.ts +48 -0
- package/spriteTextBg.d.ts +1 -0
- package/spriteTextBg.js +20 -0
- package/spriteTextBg.ts +20 -0
- package/threeLoader.d.ts +8 -7
- package/threeLoader.js +58 -67
- package/threeLoader.ts +525 -0
- package/threeUtils.d.ts +2 -1
- package/threeUtils.js +24 -25
- package/threeUtils.ts +373 -0
- package/types.d.ts +2 -0
- package/types.js +6 -0
- package/types.ts +8 -0
- package/ApngTexture.d.ts +0 -13
- package/ApngTexture.js +0 -61
- package/ApngTextureManage.d.ts +0 -18
- package/ApngTextureManage.js +0 -87
- package/KeyFrameAnimation.d.ts +0 -25
- package/KeyFrameAnimation.js +0 -78
- package/keyContorls.d.ts +0 -25
- package/lib/draco/draco_decoder.js +0 -34
- package/lib/draco/draco_decoder.wasm +0 -0
- package/lib/draco/draco_wasm_wrapper.js +0 -117
- package/pass/emissive_ao_pass.d.ts +0 -13
- package/pass/emissive_ao_pass.js +0 -370
- package/shaders.d.ts +0 -5
- package/shaders.js +0 -93
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { ShaderMaterial, Vector2, ShaderChunk, NoBlending } from "three";
|
|
2
|
+
export const baseTextureToRenderShader = new ShaderMaterial({
|
|
3
|
+
uniforms: {
|
|
4
|
+
tDiffuse: { value: null },
|
|
5
|
+
resolution: { value: new Vector2(1 / 1024, 1 / 1024) },
|
|
6
|
+
/** 抖动强度:1.0 = 标准 ±0.5 LSB(总跨度 1/255),0 = 关闭(A/B 对比用) */
|
|
7
|
+
uDitherStrength: { value: 1.0 }
|
|
8
|
+
},
|
|
9
|
+
vertexShader: `
|
|
10
|
+
${ShaderChunk.common}
|
|
11
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
12
|
+
varying vec2 vUv;
|
|
13
|
+
void main() {
|
|
14
|
+
vUv = uv;
|
|
15
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
16
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
17
|
+
}
|
|
18
|
+
`,
|
|
19
|
+
fragmentShader: `
|
|
20
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
21
|
+
precision highp float;
|
|
22
|
+
|
|
23
|
+
uniform sampler2D tDiffuse;
|
|
24
|
+
|
|
25
|
+
uniform vec2 resolution;
|
|
26
|
+
|
|
27
|
+
/** 抖动强度(1.0 = ±0.5 LSB;0 = 关闭) */
|
|
28
|
+
uniform float uDitherStrength;
|
|
29
|
+
|
|
30
|
+
varying vec2 vUv;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 交错梯度噪声 Interleaved Gradient Noise,返回 [0,1)。
|
|
34
|
+
*
|
|
35
|
+
* 为什么不用 Bayer 有序矩阵(2026-09-06 皇上反馈「辉光透明度不对」后改):
|
|
36
|
+
* Bayer 是 8×8 块状循环图案,在大面积柔和渐变(外辉光/天空/雾)上会形成**肉眼可见的规则
|
|
37
|
+
* 网格/点阵**,把自然的透明度渐变打成"脏"的质感;辉光暗部(R 仅 16~47)一个码值就是
|
|
38
|
+
* 2%~6% 跳变,网格尤其明显。IGN 是高频交错梯度,没有块状结构,人眼几乎察觉不到。
|
|
39
|
+
*
|
|
40
|
+
* 为什么不用 sin()/大数 fract() 版哈希(如 hash12):它依赖 fract(4531.99) 这类大数的
|
|
41
|
+
* 小数位精度,在不同 GPU / 驱动 / 精度限定符(mediump vs highp)下行为不一致,
|
|
42
|
+
* 存在退化成常数的风险(一旦退化,抖动就变成恒定偏移,色带一根没少)。
|
|
43
|
+
* IGN 内部最大值约 52.98,精度安全边际大得多。
|
|
44
|
+
* ⚠️ 澄清:Bayer 被替换**不是**因为精度(实测大坐标下不退化),纯粹是块状网格的观感问题。
|
|
45
|
+
*/
|
|
46
|
+
float ign(vec2 p) {
|
|
47
|
+
return fract(52.9829189 * fract(0.06711056 * p.x + 0.00583715 * p.y));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
#ifndef FXAA_DISCARD
|
|
51
|
+
#define FXAA_DISCARD 0
|
|
52
|
+
#endif
|
|
53
|
+
|
|
54
|
+
/*--------------------------------------------------------------------------*/
|
|
55
|
+
#define FxaaTexTop(t, p) texture2D(t, p, -100.0)
|
|
56
|
+
#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), -100.0)
|
|
57
|
+
/*--------------------------------------------------------------------------*/
|
|
58
|
+
|
|
59
|
+
#define NUM_SAMPLES 5
|
|
60
|
+
|
|
61
|
+
float contrast( vec4 a, vec4 b ) {
|
|
62
|
+
vec4 diff = abs( a - b );
|
|
63
|
+
return max( max( max( diff.r, diff.g ), diff.b ), diff.a );
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*============================================================================
|
|
67
|
+
|
|
68
|
+
FXAA3 QUALITY - PC
|
|
69
|
+
|
|
70
|
+
============================================================================*/
|
|
71
|
+
|
|
72
|
+
/*--------------------------------------------------------------------------*/
|
|
73
|
+
vec4 FxaaPixelShader(
|
|
74
|
+
vec2 posM,
|
|
75
|
+
sampler2D tex,
|
|
76
|
+
vec2 fxaaQualityRcpFrame,
|
|
77
|
+
float fxaaQualityEdgeThreshold,
|
|
78
|
+
float fxaaQualityinvEdgeThreshold
|
|
79
|
+
) {
|
|
80
|
+
vec4 rgbaM = FxaaTexTop(tex, posM);
|
|
81
|
+
vec4 rgbaS = FxaaTexOff(tex, posM, vec2( 0.0, 1.0), fxaaQualityRcpFrame.xy);
|
|
82
|
+
vec4 rgbaE = FxaaTexOff(tex, posM, vec2( 1.0, 0.0), fxaaQualityRcpFrame.xy);
|
|
83
|
+
vec4 rgbaN = FxaaTexOff(tex, posM, vec2( 0.0,-1.0), fxaaQualityRcpFrame.xy);
|
|
84
|
+
vec4 rgbaW = FxaaTexOff(tex, posM, vec2(-1.0, 0.0), fxaaQualityRcpFrame.xy);
|
|
85
|
+
|
|
86
|
+
bool earlyExit = max( max( max(
|
|
87
|
+
contrast( rgbaM, rgbaN ),
|
|
88
|
+
contrast( rgbaM, rgbaS ) ),
|
|
89
|
+
contrast( rgbaM, rgbaE ) ),
|
|
90
|
+
contrast( rgbaM, rgbaW ) )
|
|
91
|
+
< fxaaQualityEdgeThreshold;
|
|
92
|
+
|
|
93
|
+
#if (FXAA_DISCARD == 1)
|
|
94
|
+
if(earlyExit) FxaaDiscard;
|
|
95
|
+
#else
|
|
96
|
+
if(earlyExit) return rgbaM;
|
|
97
|
+
#endif
|
|
98
|
+
|
|
99
|
+
float contrastN = contrast( rgbaM, rgbaN );
|
|
100
|
+
float contrastS = contrast( rgbaM, rgbaS );
|
|
101
|
+
float contrastE = contrast( rgbaM, rgbaE );
|
|
102
|
+
float contrastW = contrast( rgbaM, rgbaW );
|
|
103
|
+
|
|
104
|
+
float relativeVContrast = ( contrastN + contrastS ) - ( contrastE + contrastW );
|
|
105
|
+
relativeVContrast *= fxaaQualityinvEdgeThreshold;
|
|
106
|
+
|
|
107
|
+
bool horzSpan = relativeVContrast > 0.;
|
|
108
|
+
|
|
109
|
+
if( abs( relativeVContrast ) < .3 ) {
|
|
110
|
+
vec2 dirToEdge;
|
|
111
|
+
dirToEdge.x = contrastE > contrastW ? 1. : -1.;
|
|
112
|
+
dirToEdge.y = contrastS > contrastN ? 1. : -1.;
|
|
113
|
+
|
|
114
|
+
vec4 rgbaAlongH = FxaaTexOff(tex, posM, vec2( dirToEdge.x, -dirToEdge.y ), fxaaQualityRcpFrame.xy);
|
|
115
|
+
float matchAlongH = contrast( rgbaM, rgbaAlongH );
|
|
116
|
+
|
|
117
|
+
vec4 rgbaAlongV = FxaaTexOff(tex, posM, vec2( -dirToEdge.x, dirToEdge.y ), fxaaQualityRcpFrame.xy);
|
|
118
|
+
float matchAlongV = contrast( rgbaM, rgbaAlongV );
|
|
119
|
+
|
|
120
|
+
relativeVContrast = matchAlongV - matchAlongH;
|
|
121
|
+
relativeVContrast *= fxaaQualityinvEdgeThreshold;
|
|
122
|
+
|
|
123
|
+
if( abs( relativeVContrast ) < .3 ) {
|
|
124
|
+
return mix(
|
|
125
|
+
rgbaM,
|
|
126
|
+
(rgbaN + rgbaS + rgbaE + rgbaW) * .25,
|
|
127
|
+
.4
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
horzSpan = relativeVContrast > 0.;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if(!horzSpan) rgbaN = rgbaW;
|
|
135
|
+
if(!horzSpan) rgbaS = rgbaE;
|
|
136
|
+
|
|
137
|
+
bool pairN = contrast( rgbaM, rgbaN ) > contrast( rgbaM, rgbaS );
|
|
138
|
+
if(!pairN) rgbaN = rgbaS;
|
|
139
|
+
|
|
140
|
+
vec2 offNP;
|
|
141
|
+
offNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;
|
|
142
|
+
offNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;
|
|
143
|
+
|
|
144
|
+
bool doneN = false;
|
|
145
|
+
bool doneP = false;
|
|
146
|
+
|
|
147
|
+
float nDist = 0.;
|
|
148
|
+
float pDist = 0.;
|
|
149
|
+
|
|
150
|
+
vec2 posN = posM;
|
|
151
|
+
vec2 posP = posM;
|
|
152
|
+
|
|
153
|
+
int iterationsUsed = 0;
|
|
154
|
+
int iterationsUsedN = 0;
|
|
155
|
+
int iterationsUsedP = 0;
|
|
156
|
+
for( int i = 0; i < NUM_SAMPLES; i++ ) {
|
|
157
|
+
iterationsUsed = i;
|
|
158
|
+
|
|
159
|
+
float increment = float(i + 1);
|
|
160
|
+
|
|
161
|
+
if(!doneN) {
|
|
162
|
+
nDist += increment;
|
|
163
|
+
posN = posM + offNP * nDist;
|
|
164
|
+
vec4 rgbaEndN = FxaaTexTop(tex, posN.xy);
|
|
165
|
+
doneN = contrast( rgbaEndN, rgbaM ) > contrast( rgbaEndN, rgbaN );
|
|
166
|
+
iterationsUsedN = i;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if(!doneP) {
|
|
170
|
+
pDist += increment;
|
|
171
|
+
posP = posM - offNP * pDist;
|
|
172
|
+
vec4 rgbaEndP = FxaaTexTop(tex, posP.xy);
|
|
173
|
+
doneP = contrast( rgbaEndP, rgbaM ) > contrast( rgbaEndP, rgbaN );
|
|
174
|
+
iterationsUsedP = i;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if(doneN || doneP) break;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
if ( !doneP && !doneN ) return rgbaM;
|
|
182
|
+
|
|
183
|
+
float dist = min(
|
|
184
|
+
doneN ? float( iterationsUsedN ) / float( NUM_SAMPLES - 1 ) : 1.,
|
|
185
|
+
doneP ? float( iterationsUsedP ) / float( NUM_SAMPLES - 1 ) : 1.
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
dist = pow(dist, .5);
|
|
189
|
+
|
|
190
|
+
dist = 1. - dist;
|
|
191
|
+
|
|
192
|
+
return mix(
|
|
193
|
+
rgbaM,
|
|
194
|
+
rgbaN,
|
|
195
|
+
dist * .5
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
void main() {
|
|
200
|
+
const float edgeDetectionQuality = .2;
|
|
201
|
+
const float invEdgeDetectionQuality = 1. / edgeDetectionQuality;
|
|
202
|
+
|
|
203
|
+
vec4 srgbColor = sRGBTransferOETF(FxaaPixelShader(
|
|
204
|
+
vUv,
|
|
205
|
+
tDiffuse,
|
|
206
|
+
resolution,
|
|
207
|
+
edgeDetectionQuality,
|
|
208
|
+
invEdgeDetectionQuality
|
|
209
|
+
));
|
|
210
|
+
|
|
211
|
+
// ---- 终处理抖动(dither):消除 8bit 输出量化的色带 ----
|
|
212
|
+
// 屏幕 framebuffer 只有 8bit,柔和渐变(外辉光/天空/雾/bloom 衰减)在此被量化成
|
|
213
|
+
// 肉眼可见的"一层一层"台阶。叠加 ±0.5 LSB(总跨度 1/255)的屏幕空间随机噪声后,
|
|
214
|
+
// 台阶被打散成高频颗粒——人眼对高频噪声极不敏感,色带随即消失(2026-09-06 修)。
|
|
215
|
+
// 注意:dither 只补偿「最终 8bit 输出」这一步;中间 RT 的线性量化色带由
|
|
216
|
+
// ThreeBase 的 baseRenderTarget/screenRenderTarget 改 HalfFloatType 根治。
|
|
217
|
+
// 二者缺一不可:半浮点恢复渐变连续性,dither 消除「源数据动态范围不足」型色带
|
|
218
|
+
// (如 SpriteText3 外辉光 R 通道在源图只有 39~46 共 8 个码值,34px 上必然每 5px 一跳)。
|
|
219
|
+
float dither = (ign(gl_FragCoord.xy) - 0.5) * (1.0 / 255.0) * uDitherStrength;
|
|
220
|
+
gl_FragColor = vec4(srgbColor.rgb + dither, srgbColor.a);
|
|
221
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
222
|
+
}
|
|
223
|
+
`,
|
|
224
|
+
blending: NoBlending,
|
|
225
|
+
depthTest: false,
|
|
226
|
+
depthWrite: false,
|
|
227
|
+
transparent: true,
|
|
228
|
+
// 终处理:手写 sRGBTransferOETF 已是唯一一次 sRGB 编码;关闭 three 的自动 tonemap/colorspace 注入,
|
|
229
|
+
// 防止渲染到屏幕时被 three 再编码一次(本 ShaderMaterial 不写 include 块,three 本就不会注入,
|
|
230
|
+
// 这里显式置 false 仅是防御,保证颜色空间语义单一可控)。
|
|
231
|
+
toneMapped: false,
|
|
232
|
+
});
|
package/shaders/copyShader.js
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { ShaderChunk, ShaderMaterial } from "three";
|
|
2
|
-
// 拷贝着色器
|
|
3
2
|
const copyShader = new ShaderMaterial({
|
|
4
3
|
uniforms: {
|
|
5
|
-
map: { value: null },
|
|
6
|
-
opacity: { value: 1 },
|
|
4
|
+
map: { value: null },
|
|
5
|
+
opacity: { value: 1 },
|
|
7
6
|
},
|
|
8
7
|
vertexShader: `
|
|
9
8
|
${ShaderChunk.common}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { ShaderChunk, ShaderMaterial } from "three";
|
|
2
|
+
const copyShader = new ShaderMaterial({
|
|
3
|
+
uniforms: {
|
|
4
|
+
map: { value: null },
|
|
5
|
+
opacity: { value: 1 },
|
|
6
|
+
},
|
|
7
|
+
vertexShader: `
|
|
8
|
+
${ShaderChunk.common}
|
|
9
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
10
|
+
varying vec2 vUv;
|
|
11
|
+
void main() {
|
|
12
|
+
vUv = uv;
|
|
13
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
14
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
15
|
+
}
|
|
16
|
+
`,
|
|
17
|
+
fragmentShader: `
|
|
18
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
19
|
+
uniform float opacity;
|
|
20
|
+
uniform sampler2D map;
|
|
21
|
+
varying vec2 vUv;
|
|
22
|
+
void main() {
|
|
23
|
+
gl_FragColor = texture2D(map, vUv);
|
|
24
|
+
gl_FragColor.a *= opacity;
|
|
25
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
26
|
+
}
|
|
27
|
+
`,
|
|
28
|
+
depthTest: true,
|
|
29
|
+
depthWrite: true,
|
|
30
|
+
transparent: true,
|
|
31
|
+
});
|
|
32
|
+
export default copyShader;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ShaderMaterial } from "three";
|
|
2
|
+
/**
|
|
3
|
+
* 调试用:把「全局 base 深度」与「最近一次 glow/stroke 选区的 select 深度」并排显示,
|
|
4
|
+
* 用于排查"深度测试全部失效"根因:
|
|
5
|
+
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
6
|
+
* G = 选区自身深度(selectDepthTexture,由 glow_pass/stroke_pass 渲染后写入 debugDepthState)
|
|
7
|
+
* 两路都用 `pow(cameraFar+1, d)-1` 反推到近似线性视深再归一化(背景≈1 → 黄白)。
|
|
8
|
+
* - R 全白、G 也有内容 → 全局 base 深度没写进(renderAoDepthPass 失效),但选区深度正常;
|
|
9
|
+
* - R、G 都全白 → 两路深度都没写进;
|
|
10
|
+
* - R 有灰阶、G 全白 → 选区深度没写进(glow/stroke 自身的深度 pass 失效);
|
|
11
|
+
* - R、G 都有灰阶 → 深度正常,问题在 depthTestShader 比对侧。
|
|
12
|
+
*/
|
|
13
|
+
declare const debugDepthCompareShader: ShaderMaterial;
|
|
14
|
+
export default debugDepthCompareShader;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ShaderChunk, ShaderMaterial } from "three";
|
|
2
|
+
/**
|
|
3
|
+
* 调试用:把「全局 base 深度」与「最近一次 glow/stroke 选区的 select 深度」并排显示,
|
|
4
|
+
* 用于排查"深度测试全部失效"根因:
|
|
5
|
+
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
6
|
+
* G = 选区自身深度(selectDepthTexture,由 glow_pass/stroke_pass 渲染后写入 debugDepthState)
|
|
7
|
+
* 两路都用 `pow(cameraFar+1, d)-1` 反推到近似线性视深再归一化(背景≈1 → 黄白)。
|
|
8
|
+
* - R 全白、G 也有内容 → 全局 base 深度没写进(renderAoDepthPass 失效),但选区深度正常;
|
|
9
|
+
* - R、G 都全白 → 两路深度都没写进;
|
|
10
|
+
* - R 有灰阶、G 全白 → 选区深度没写进(glow/stroke 自身的深度 pass 失效);
|
|
11
|
+
* - R、G 都有灰阶 → 深度正常,问题在 depthTestShader 比对侧。
|
|
12
|
+
*/
|
|
13
|
+
const debugDepthCompareShader = new ShaderMaterial({
|
|
14
|
+
uniforms: {
|
|
15
|
+
tBase: { value: null },
|
|
16
|
+
tSelect: { value: null },
|
|
17
|
+
cameraFar: { value: 1000.0 },
|
|
18
|
+
},
|
|
19
|
+
vertexShader: `
|
|
20
|
+
${ShaderChunk.common}
|
|
21
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
22
|
+
varying vec2 vUv;
|
|
23
|
+
void main() {
|
|
24
|
+
vUv = uv;
|
|
25
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
26
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
27
|
+
}
|
|
28
|
+
`,
|
|
29
|
+
fragmentShader: `
|
|
30
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
31
|
+
uniform sampler2D tBase;
|
|
32
|
+
uniform sampler2D tSelect;
|
|
33
|
+
uniform float cameraFar;
|
|
34
|
+
varying vec2 vUv;
|
|
35
|
+
void main() {
|
|
36
|
+
float baseD = texture2D(tBase, vUv).r;
|
|
37
|
+
float selD = texture2D(tSelect, vUv).r;
|
|
38
|
+
// 与 stroke_pass 的 __STROKE_DEPTH_VIS 同一反推公式,保证两座视图语义一致
|
|
39
|
+
float vb = pow(cameraFar + 1.0, baseD) - 1.0;
|
|
40
|
+
float vs = pow(cameraFar + 1.0, selD) - 1.0;
|
|
41
|
+
gl_FragColor = vec4(vb / cameraFar, vs / cameraFar, 0.0, 1.0);
|
|
42
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
43
|
+
}
|
|
44
|
+
`,
|
|
45
|
+
depthTest: false,
|
|
46
|
+
depthWrite: false,
|
|
47
|
+
transparent: true,
|
|
48
|
+
});
|
|
49
|
+
export default debugDepthCompareShader;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ShaderChunk, ShaderMaterial } from "three";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 调试用:把「全局 base 深度」与「最近一次 glow/stroke 选区的 select 深度」并排显示,
|
|
5
|
+
* 用于排查"深度测试全部失效"根因:
|
|
6
|
+
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
7
|
+
* G = 选区自身深度(selectDepthTexture,由 glow_pass/stroke_pass 渲染后写入 debugDepthState)
|
|
8
|
+
* 两路都用 `pow(cameraFar+1, d)-1` 反推到近似线性视深再归一化(背景≈1 → 黄白)。
|
|
9
|
+
* - R 全白、G 也有内容 → 全局 base 深度没写进(renderAoDepthPass 失效),但选区深度正常;
|
|
10
|
+
* - R、G 都全白 → 两路深度都没写进;
|
|
11
|
+
* - R 有灰阶、G 全白 → 选区深度没写进(glow/stroke 自身的深度 pass 失效);
|
|
12
|
+
* - R、G 都有灰阶 → 深度正常,问题在 depthTestShader 比对侧。
|
|
13
|
+
*/
|
|
14
|
+
const debugDepthCompareShader = new ShaderMaterial({
|
|
15
|
+
uniforms: {
|
|
16
|
+
tBase: { value: null as unknown as import("three").Texture },
|
|
17
|
+
tSelect: { value: null as unknown as import("three").Texture },
|
|
18
|
+
cameraFar: { value: 1000.0 },
|
|
19
|
+
},
|
|
20
|
+
vertexShader: `
|
|
21
|
+
${ShaderChunk.common}
|
|
22
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
23
|
+
varying vec2 vUv;
|
|
24
|
+
void main() {
|
|
25
|
+
vUv = uv;
|
|
26
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
27
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
28
|
+
}
|
|
29
|
+
`,
|
|
30
|
+
fragmentShader: `
|
|
31
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
32
|
+
uniform sampler2D tBase;
|
|
33
|
+
uniform sampler2D tSelect;
|
|
34
|
+
uniform float cameraFar;
|
|
35
|
+
varying vec2 vUv;
|
|
36
|
+
void main() {
|
|
37
|
+
float baseD = texture2D(tBase, vUv).r;
|
|
38
|
+
float selD = texture2D(tSelect, vUv).r;
|
|
39
|
+
// 与 stroke_pass 的 __STROKE_DEPTH_VIS 同一反推公式,保证两座视图语义一致
|
|
40
|
+
float vb = pow(cameraFar + 1.0, baseD) - 1.0;
|
|
41
|
+
float vs = pow(cameraFar + 1.0, selD) - 1.0;
|
|
42
|
+
gl_FragColor = vec4(vb / cameraFar, vs / cameraFar, 0.0, 1.0);
|
|
43
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
44
|
+
}
|
|
45
|
+
`,
|
|
46
|
+
depthTest: false,
|
|
47
|
+
depthWrite: false,
|
|
48
|
+
transparent: true,
|
|
49
|
+
});
|
|
50
|
+
export default debugDepthCompareShader;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ShaderMaterial } from "three";
|
|
2
|
+
/**
|
|
3
|
+
* 调试用:把「深度测试判定」本身画出来,用于定位"后处理深度测试全部失效"。
|
|
4
|
+
*
|
|
5
|
+
* 通道语义(全部为**原始**深度值,不做对数反解,避免饱和丢信息):
|
|
6
|
+
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
7
|
+
* G = 选区自身深度(selectDepthTexture,glow/stroke 渲染后写入 debugDepthState)
|
|
8
|
+
* B = 判定结果:baseD < selD - bias ? 1 : 0
|
|
9
|
+
* 与 stroke_pass 的 depthTestShader 同一判定式(bias = 0.0006):
|
|
10
|
+
* 1(蓝) = 判为被更近物体挡住 → 该像素应 discard;0(黑) = 不丢弃。
|
|
11
|
+
*
|
|
12
|
+
* 判读:
|
|
13
|
+
* - 物体区域(G 明显暗于 1.0 的像素)B 全黑 → 判定从不触发,后处理必"一律显示在最前";
|
|
14
|
+
* 再看该区域 R 与 G 谁大:R 反而比 G 大(base 比 select 还远)→ base 深度图里缺了遮挡物。
|
|
15
|
+
* - 物体区域 B 有蓝 → 判定本身正常,问题在后续合成(叠加顺序/混合)。
|
|
16
|
+
*/
|
|
17
|
+
declare const debugDepthJudgeShader: ShaderMaterial;
|
|
18
|
+
export default debugDepthJudgeShader;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ShaderChunk, ShaderMaterial } from "three";
|
|
2
|
+
import { DEPTH_TEST_BIAS } from "../pass/depthTestBias";
|
|
3
|
+
/**
|
|
4
|
+
* 调试用:把「深度测试判定」本身画出来,用于定位"后处理深度测试全部失效"。
|
|
5
|
+
*
|
|
6
|
+
* 通道语义(全部为**原始**深度值,不做对数反解,避免饱和丢信息):
|
|
7
|
+
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
8
|
+
* G = 选区自身深度(selectDepthTexture,glow/stroke 渲染后写入 debugDepthState)
|
|
9
|
+
* B = 判定结果:baseD < selD - bias ? 1 : 0
|
|
10
|
+
* 与 stroke_pass 的 depthTestShader 同一判定式(bias = 0.0006):
|
|
11
|
+
* 1(蓝) = 判为被更近物体挡住 → 该像素应 discard;0(黑) = 不丢弃。
|
|
12
|
+
*
|
|
13
|
+
* 判读:
|
|
14
|
+
* - 物体区域(G 明显暗于 1.0 的像素)B 全黑 → 判定从不触发,后处理必"一律显示在最前";
|
|
15
|
+
* 再看该区域 R 与 G 谁大:R 反而比 G 大(base 比 select 还远)→ base 深度图里缺了遮挡物。
|
|
16
|
+
* - 物体区域 B 有蓝 → 判定本身正常,问题在后续合成(叠加顺序/混合)。
|
|
17
|
+
*/
|
|
18
|
+
const debugDepthJudgeShader = new ShaderMaterial({
|
|
19
|
+
uniforms: {
|
|
20
|
+
tBase: { value: null },
|
|
21
|
+
tSelect: { value: null },
|
|
22
|
+
},
|
|
23
|
+
vertexShader: `
|
|
24
|
+
${ShaderChunk.common}
|
|
25
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
26
|
+
varying vec2 vUv;
|
|
27
|
+
void main() {
|
|
28
|
+
vUv = uv;
|
|
29
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
30
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
31
|
+
}
|
|
32
|
+
`,
|
|
33
|
+
fragmentShader: `
|
|
34
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
35
|
+
uniform sampler2D tBase;
|
|
36
|
+
uniform sampler2D tSelect;
|
|
37
|
+
varying vec2 vUv;
|
|
38
|
+
void main() {
|
|
39
|
+
float baseD = texture2D(tBase, vUv).r;
|
|
40
|
+
float selD = texture2D(tSelect, vUv).r;
|
|
41
|
+
// 与 depthTestShader 完全一致的判定式(同用 DEPTH_TEST_BIAS 单一常量源):
|
|
42
|
+
// 对数深度下值越小越近,base 比 select 近过容差 → 判为被遮挡(应 discard)。
|
|
43
|
+
float judged = step(baseD, selD - ${DEPTH_TEST_BIAS});
|
|
44
|
+
gl_FragColor = vec4(baseD, selD, judged, 1.0);
|
|
45
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
46
|
+
}
|
|
47
|
+
`,
|
|
48
|
+
depthTest: false,
|
|
49
|
+
depthWrite: false,
|
|
50
|
+
transparent: true,
|
|
51
|
+
});
|
|
52
|
+
export default debugDepthJudgeShader;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ShaderChunk, ShaderMaterial, Texture } from "three";
|
|
2
|
+
import { DEPTH_TEST_BIAS } from "../pass/depthTestBias";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* 调试用:把「深度测试判定」本身画出来,用于定位"后处理深度测试全部失效"。
|
|
6
|
+
*
|
|
7
|
+
* 通道语义(全部为**原始**深度值,不做对数反解,避免饱和丢信息):
|
|
8
|
+
* R = 全局 base 深度(baseDepthTexture,排除地板)
|
|
9
|
+
* G = 选区自身深度(selectDepthTexture,glow/stroke 渲染后写入 debugDepthState)
|
|
10
|
+
* B = 判定结果:baseD < selD - bias ? 1 : 0
|
|
11
|
+
* 与 stroke_pass 的 depthTestShader 同一判定式(bias = 0.0006):
|
|
12
|
+
* 1(蓝) = 判为被更近物体挡住 → 该像素应 discard;0(黑) = 不丢弃。
|
|
13
|
+
*
|
|
14
|
+
* 判读:
|
|
15
|
+
* - 物体区域(G 明显暗于 1.0 的像素)B 全黑 → 判定从不触发,后处理必"一律显示在最前";
|
|
16
|
+
* 再看该区域 R 与 G 谁大:R 反而比 G 大(base 比 select 还远)→ base 深度图里缺了遮挡物。
|
|
17
|
+
* - 物体区域 B 有蓝 → 判定本身正常,问题在后续合成(叠加顺序/混合)。
|
|
18
|
+
*/
|
|
19
|
+
const debugDepthJudgeShader = new ShaderMaterial({
|
|
20
|
+
uniforms: {
|
|
21
|
+
tBase: { value: null as unknown as Texture },
|
|
22
|
+
tSelect: { value: null as unknown as Texture },
|
|
23
|
+
},
|
|
24
|
+
vertexShader: `
|
|
25
|
+
${ShaderChunk.common}
|
|
26
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
27
|
+
varying vec2 vUv;
|
|
28
|
+
void main() {
|
|
29
|
+
vUv = uv;
|
|
30
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
31
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
32
|
+
}
|
|
33
|
+
`,
|
|
34
|
+
fragmentShader: `
|
|
35
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
36
|
+
uniform sampler2D tBase;
|
|
37
|
+
uniform sampler2D tSelect;
|
|
38
|
+
varying vec2 vUv;
|
|
39
|
+
void main() {
|
|
40
|
+
float baseD = texture2D(tBase, vUv).r;
|
|
41
|
+
float selD = texture2D(tSelect, vUv).r;
|
|
42
|
+
// 与 depthTestShader 完全一致的判定式(同用 DEPTH_TEST_BIAS 单一常量源):
|
|
43
|
+
// 对数深度下值越小越近,base 比 select 近过容差 → 判为被遮挡(应 discard)。
|
|
44
|
+
float judged = step(baseD, selD - ${DEPTH_TEST_BIAS});
|
|
45
|
+
gl_FragColor = vec4(baseD, selD, judged, 1.0);
|
|
46
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
47
|
+
}
|
|
48
|
+
`,
|
|
49
|
+
depthTest: false,
|
|
50
|
+
depthWrite: false,
|
|
51
|
+
transparent: true,
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
export default debugDepthJudgeShader;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ShaderMaterial } from "three";
|
|
2
|
+
/**
|
|
3
|
+
* 调试用:把「可见深度图」与「被排除面 mask」叠在一起看。
|
|
4
|
+
*
|
|
5
|
+
* 底色 = baseDepthTexture 灰度(近黑远白,同「全局深度图」档);
|
|
6
|
+
* 红色 = 该像素上的表面被 renderAoDepthPass 排除(sprite/线条/点、userData.aoTransparent、
|
|
7
|
+
* 标了 userData.aoFloor 的地板 Ground1 等)→ **它写不进深度图,永远挡不住任何后处理**。
|
|
8
|
+
*
|
|
9
|
+
* 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被设计成可透视;
|
|
10
|
+
* 把该对象的 userData.aoTransparent 去掉 / 不要标 aoFloor,即可让它参与遮挡。
|
|
11
|
+
*/
|
|
12
|
+
declare const debugExcludedShader: ShaderMaterial;
|
|
13
|
+
export default debugExcludedShader;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ShaderChunk, ShaderMaterial } from "three";
|
|
2
|
+
/**
|
|
3
|
+
* 调试用:把「可见深度图」与「被排除面 mask」叠在一起看。
|
|
4
|
+
*
|
|
5
|
+
* 底色 = baseDepthTexture 灰度(近黑远白,同「全局深度图」档);
|
|
6
|
+
* 红色 = 该像素上的表面被 renderAoDepthPass 排除(sprite/线条/点、userData.aoTransparent、
|
|
7
|
+
* 标了 userData.aoFloor 的地板 Ground1 等)→ **它写不进深度图,永远挡不住任何后处理**。
|
|
8
|
+
*
|
|
9
|
+
* 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被设计成可透视;
|
|
10
|
+
* 把该对象的 userData.aoTransparent 去掉 / 不要标 aoFloor,即可让它参与遮挡。
|
|
11
|
+
*/
|
|
12
|
+
const debugExcludedShader = new ShaderMaterial({
|
|
13
|
+
uniforms: {
|
|
14
|
+
tDepth: { value: null },
|
|
15
|
+
tMask: { value: null },
|
|
16
|
+
},
|
|
17
|
+
vertexShader: `
|
|
18
|
+
${ShaderChunk.common}
|
|
19
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
20
|
+
varying vec2 vUv;
|
|
21
|
+
void main() {
|
|
22
|
+
vUv = uv;
|
|
23
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
24
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
25
|
+
}
|
|
26
|
+
`,
|
|
27
|
+
fragmentShader: `
|
|
28
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
29
|
+
uniform sampler2D tDepth;
|
|
30
|
+
uniform sampler2D tMask;
|
|
31
|
+
varying vec2 vUv;
|
|
32
|
+
void main() {
|
|
33
|
+
float d = texture2D(tDepth, vUv).r;
|
|
34
|
+
float mask = texture2D(tMask, vUv).r;
|
|
35
|
+
// 灰度深度 + 被排除面叠红(mask 为纯红,取 r 通道即可)
|
|
36
|
+
vec3 col = vec3(d, d, d);
|
|
37
|
+
col = mix(col, vec3(1.0, 0.15, 0.15), mask * 0.85);
|
|
38
|
+
gl_FragColor = vec4(col, 1.0);
|
|
39
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
40
|
+
}
|
|
41
|
+
`,
|
|
42
|
+
depthTest: false,
|
|
43
|
+
depthWrite: false,
|
|
44
|
+
transparent: true,
|
|
45
|
+
});
|
|
46
|
+
export default debugExcludedShader;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { ShaderChunk, ShaderMaterial, Texture } from "three";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 调试用:把「可见深度图」与「被排除面 mask」叠在一起看。
|
|
5
|
+
*
|
|
6
|
+
* 底色 = baseDepthTexture 灰度(近黑远白,同「全局深度图」档);
|
|
7
|
+
* 红色 = 该像素上的表面被 renderAoDepthPass 排除(sprite/线条/点、userData.aoTransparent、
|
|
8
|
+
* 标了 userData.aoFloor 的地板 Ground1 等)→ **它写不进深度图,永远挡不住任何后处理**。
|
|
9
|
+
*
|
|
10
|
+
* 判读:挡不住你的那个面如果是红的 → 不是深度算法坏了,是它被设计成可透视;
|
|
11
|
+
* 把该对象的 userData.aoTransparent 去掉 / 不要标 aoFloor,即可让它参与遮挡。
|
|
12
|
+
*/
|
|
13
|
+
const debugExcludedShader = new ShaderMaterial({
|
|
14
|
+
uniforms: {
|
|
15
|
+
tDepth: { value: null as unknown as Texture },
|
|
16
|
+
tMask: { value: null as unknown as Texture },
|
|
17
|
+
},
|
|
18
|
+
vertexShader: `
|
|
19
|
+
${ShaderChunk.common}
|
|
20
|
+
${ShaderChunk.logdepthbuf_pars_vertex}
|
|
21
|
+
varying vec2 vUv;
|
|
22
|
+
void main() {
|
|
23
|
+
vUv = uv;
|
|
24
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
|
|
25
|
+
${ShaderChunk.logdepthbuf_vertex}
|
|
26
|
+
}
|
|
27
|
+
`,
|
|
28
|
+
fragmentShader: `
|
|
29
|
+
${ShaderChunk.logdepthbuf_pars_fragment}
|
|
30
|
+
uniform sampler2D tDepth;
|
|
31
|
+
uniform sampler2D tMask;
|
|
32
|
+
varying vec2 vUv;
|
|
33
|
+
void main() {
|
|
34
|
+
float d = texture2D(tDepth, vUv).r;
|
|
35
|
+
float mask = texture2D(tMask, vUv).r;
|
|
36
|
+
// 灰度深度 + 被排除面叠红(mask 为纯红,取 r 通道即可)
|
|
37
|
+
vec3 col = vec3(d, d, d);
|
|
38
|
+
col = mix(col, vec3(1.0, 0.15, 0.15), mask * 0.85);
|
|
39
|
+
gl_FragColor = vec4(col, 1.0);
|
|
40
|
+
${ShaderChunk.logdepthbuf_fragment}
|
|
41
|
+
}
|
|
42
|
+
`,
|
|
43
|
+
depthTest: false,
|
|
44
|
+
depthWrite: false,
|
|
45
|
+
transparent: true,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
export default debugExcludedShader;
|