@react-three/postprocessing 2.15.5 → 2.15.6
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/dist/effects/N8AO/BlueNoise.cjs +4 -0
- package/dist/effects/N8AO/BlueNoise.cjs.map +1 -0
- package/dist/effects/N8AO/BlueNoise.js +5 -0
- package/dist/effects/N8AO/BlueNoise.js.map +1 -0
- package/dist/effects/N8AO/DepthDownSample.cjs +183 -0
- package/dist/effects/N8AO/DepthDownSample.cjs.map +1 -0
- package/dist/effects/N8AO/DepthDownSample.js +166 -0
- package/dist/effects/N8AO/DepthDownSample.js.map +1 -0
- package/dist/effects/N8AO/EffectCompositer.cjs +276 -0
- package/dist/effects/N8AO/EffectCompositer.cjs.map +1 -0
- package/dist/effects/N8AO/EffectCompositer.js +259 -0
- package/dist/effects/N8AO/EffectCompositer.js.map +1 -0
- package/dist/effects/N8AO/EffectShader.cjs +236 -0
- package/dist/effects/N8AO/EffectShader.cjs.map +1 -0
- package/dist/effects/N8AO/EffectShader.js +219 -0
- package/dist/effects/N8AO/EffectShader.js.map +1 -0
- package/dist/effects/N8AO/FullScreenTriangle.cjs +59 -0
- package/dist/effects/N8AO/FullScreenTriangle.cjs.map +1 -0
- package/dist/effects/N8AO/FullScreenTriangle.js +42 -0
- package/dist/effects/N8AO/FullScreenTriangle.js.map +1 -0
- package/dist/effects/N8AO/N8AOPostPass.cjs +501 -0
- package/dist/effects/N8AO/N8AOPostPass.cjs.map +1 -0
- package/dist/effects/N8AO/N8AOPostPass.js +484 -0
- package/dist/effects/N8AO/N8AOPostPass.js.map +1 -0
- package/dist/effects/N8AO/PoissionBlur.cjs +186 -0
- package/dist/effects/N8AO/PoissionBlur.cjs.map +1 -0
- package/dist/effects/N8AO/PoissionBlur.js +169 -0
- package/dist/effects/N8AO/PoissionBlur.js.map +1 -0
- package/dist/effects/{N8AO.cjs → N8AO/index.cjs} +3 -3
- package/dist/effects/N8AO/index.cjs.map +1 -0
- package/dist/effects/{N8AO.js → N8AO/index.js} +3 -3
- package/dist/effects/N8AO/index.js.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.js +1 -1
- package/package.json +2 -1
- package/dist/effects/N8AO.cjs.map +0 -1
- package/dist/effects/N8AO.js.map +0 -1
- package/dist/node_modules/n8ao/dist/N8AO.cjs +0 -1439
- package/dist/node_modules/n8ao/dist/N8AO.cjs.map +0 -1
- package/dist/node_modules/n8ao/dist/N8AO.js +0 -1439
- package/dist/node_modules/n8ao/dist/N8AO.js.map +0 -1
- /package/dist/effects/{N8AO.d.ts → N8AO/index.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DepthDownSample.cjs","sources":["../../../src/effects/N8AO/DepthDownSample.js"],"sourcesContent":["import * as THREE from 'three'\n\nconst DepthDownSample = {\n uniforms: {\n sceneDepth: { value: null },\n resolution: { value: new THREE.Vector2() },\n near: { value: 0.1 },\n far: { value: 1000.0 },\n viewMatrixInv: { value: new THREE.Matrix4() },\n projectionMatrixInv: { value: new THREE.Matrix4() },\n logDepth: { value: false },\n },\n depthWrite: false,\n depthTest: false,\n\n vertexShader: /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position, 1);\n }`,\n fragmentShader: /* glsl */ `\n uniform highp sampler2D sceneDepth;\n uniform vec2 resolution;\n uniform float near;\n uniform float far;\n uniform bool logDepth;\n uniform mat4 viewMatrixInv;\n uniform mat4 projectionMatrixInv;\n varying vec2 vUv;\n layout(location = 1) out vec4 gNormal;\n vec3 getWorldPosLog(vec3 posS) {\n vec2 uv = posS.xy;\n float z = posS.z;\n float nearZ =near;\n float farZ = far;\n float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;\n vec4 wpos = projectionMatrixInv * clipVec;\n return wpos.xyz / wpos.w;\n }\n vec3 getWorldPos(float depth, vec2 coord) {\n if (logDepth) {\n return getWorldPosLog(vec3(coord, depth));\n }\n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;\n // Perspective division\n vec4 worldSpacePosition = viewSpacePosition;\n worldSpacePosition.xyz /= worldSpacePosition.w;\n return worldSpacePosition.xyz;\n }\n \n vec3 computeNormal(vec3 worldPos, vec2 vUv) {\n ivec2 p = ivec2(vUv * resolution);\n float c0 = texelFetch(sceneDepth, p, 0).x;\n float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;\n float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;\n float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;\n float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;\n float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;\n float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;\n float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;\n float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;\n \n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n \n vec3 ce = getWorldPos(c0, vUv).xyz;\n \n vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz\n : -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;\n vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz\n : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;\n \n return normalize(cross(dpdx, dpdy));\n }\n void main() {\n vec2 uv = vUv - vec2(0.5) / resolution;\n vec2 pixelSize = vec2(1.0) / resolution;\n vec2[] uvSamples = vec2[4](\n uv,\n uv + vec2(pixelSize.x, 0.0),\n uv + vec2(0.0, pixelSize.y),\n uv + pixelSize\n );\n float depth00 = texture2D(sceneDepth, uvSamples[0]).r;\n float depth10 = texture2D(sceneDepth, uvSamples[1]).r;\n float depth01 = texture2D(sceneDepth, uvSamples[2]).r;\n float depth11 = texture2D(sceneDepth, uvSamples[3]).r;\n float minDepth = min(min(depth00, depth10), min(depth01, depth11));\n float maxDepth = max(max(depth00, depth10), max(depth01, depth11));\n float targetDepth = minDepth;\n // Checkerboard pattern to avoid artifacts\n if (mod(gl_FragCoord.x + gl_FragCoord.y, 2.0) > 0.5) { \n targetDepth = maxDepth;\n }\n int chosenIndex = 0;\n float[] samples = float[4](depth00, depth10, depth01, depth11);\n for(int i = 0; i < 4; ++i) {\n if (samples[i] == targetDepth) {\n chosenIndex = i;\n break;\n }\n }\n gl_FragColor = vec4(samples[chosenIndex], 0.0, 0.0, 1.0);\n gNormal = vec4(computeNormal(\n getWorldPos(samples[chosenIndex], uvSamples[chosenIndex]), uvSamples[chosenIndex]\n ), 0.0);\n /* float[] samples = float[4](depth00, depth10, depth01, depth11);\n float c = 0.25 * (depth00 + depth10 + depth01 + depth11);\n float[] distances = float[4](depth00, depth10, depth01, depth11);\n float maxDistance = max(max(distances[0], distances[1]), max(distances[2], distances[3]));\n\n int remaining[3];\n int rejected[3];\n int i, j, k;\n\n for(i = 0, j = 0, k = 0; i < 4; ++i) {\n if (distances[i] < maxDistance) {\n remaining[j++] = i;\n } else {\n rejected[k++] = i;\n }\n }\n for(;j < 3;++j) {\n remaining[j] = rejected[--k];\n }\n vec3 s = vec3(\n samples[remaining[0]],\n samples[remaining[1]],\n samples[remaining[2]]\n );\n c = (s.x + s.y + s.z) / 3.0;\n\n distances[0] = abs(c - s.x);\n distances[1] = abs(c - s.y);\n distances[2] = abs(c - s.z);\n\n float minDistance = min(min(distances[0], distances[1]), distances[2]);\n\n for(i = 0; i < 3; ++i) {\n if (distances[i] == minDistance) {\n break;\n }\n }*/\n /* gl_FragColor = vec4(samples[remaining[i]], 0.0, 0.0, 0.0);\n gNormal = vec4(computeNormal(\n getWorldPos(samples[remaining[i]], uvSamples[remaining[i]]), uvSamples[remaining[i]]\n ), 0.0);*/\n }`,\n}\n\nexport { DepthDownSample }\n"],"names":["THREE"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEK,MAAC,kBAAkB;AAAA,EACtB,UAAU;AAAA,IACR,YAAY,EAAE,OAAO,KAAM;AAAA,IAC3B,YAAY,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IAC1C,MAAM,EAAE,OAAO,IAAK;AAAA,IACpB,KAAK,EAAE,OAAO,IAAQ;AAAA,IACtB,eAAe,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IAC7C,qBAAqB,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IACnD,UAAU,EAAE,OAAO,MAAO;AAAA,EAC3B;AAAA,EACD,YAAY;AAAA,EACZ,WAAW;AAAA,EAEX;AAAA;AAAA,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwI7B;;"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
const DepthDownSample = {
|
|
3
|
+
uniforms: {
|
|
4
|
+
sceneDepth: { value: null },
|
|
5
|
+
resolution: { value: new THREE.Vector2() },
|
|
6
|
+
near: { value: 0.1 },
|
|
7
|
+
far: { value: 1e3 },
|
|
8
|
+
viewMatrixInv: { value: new THREE.Matrix4() },
|
|
9
|
+
projectionMatrixInv: { value: new THREE.Matrix4() },
|
|
10
|
+
logDepth: { value: false }
|
|
11
|
+
},
|
|
12
|
+
depthWrite: false,
|
|
13
|
+
depthTest: false,
|
|
14
|
+
vertexShader: (
|
|
15
|
+
/* glsl */
|
|
16
|
+
`
|
|
17
|
+
varying vec2 vUv;
|
|
18
|
+
void main() {
|
|
19
|
+
vUv = uv;
|
|
20
|
+
gl_Position = vec4(position, 1);
|
|
21
|
+
}`
|
|
22
|
+
),
|
|
23
|
+
fragmentShader: (
|
|
24
|
+
/* glsl */
|
|
25
|
+
`
|
|
26
|
+
uniform highp sampler2D sceneDepth;
|
|
27
|
+
uniform vec2 resolution;
|
|
28
|
+
uniform float near;
|
|
29
|
+
uniform float far;
|
|
30
|
+
uniform bool logDepth;
|
|
31
|
+
uniform mat4 viewMatrixInv;
|
|
32
|
+
uniform mat4 projectionMatrixInv;
|
|
33
|
+
varying vec2 vUv;
|
|
34
|
+
layout(location = 1) out vec4 gNormal;
|
|
35
|
+
vec3 getWorldPosLog(vec3 posS) {
|
|
36
|
+
vec2 uv = posS.xy;
|
|
37
|
+
float z = posS.z;
|
|
38
|
+
float nearZ =near;
|
|
39
|
+
float farZ = far;
|
|
40
|
+
float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;
|
|
41
|
+
float a = farZ / (farZ - nearZ);
|
|
42
|
+
float b = farZ * nearZ / (nearZ - farZ);
|
|
43
|
+
float linDepth = a + b / depth;
|
|
44
|
+
vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;
|
|
45
|
+
vec4 wpos = projectionMatrixInv * clipVec;
|
|
46
|
+
return wpos.xyz / wpos.w;
|
|
47
|
+
}
|
|
48
|
+
vec3 getWorldPos(float depth, vec2 coord) {
|
|
49
|
+
if (logDepth) {
|
|
50
|
+
return getWorldPosLog(vec3(coord, depth));
|
|
51
|
+
}
|
|
52
|
+
float z = depth * 2.0 - 1.0;
|
|
53
|
+
vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
|
|
54
|
+
vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;
|
|
55
|
+
// Perspective division
|
|
56
|
+
vec4 worldSpacePosition = viewSpacePosition;
|
|
57
|
+
worldSpacePosition.xyz /= worldSpacePosition.w;
|
|
58
|
+
return worldSpacePosition.xyz;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
vec3 computeNormal(vec3 worldPos, vec2 vUv) {
|
|
62
|
+
ivec2 p = ivec2(vUv * resolution);
|
|
63
|
+
float c0 = texelFetch(sceneDepth, p, 0).x;
|
|
64
|
+
float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;
|
|
65
|
+
float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;
|
|
66
|
+
float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;
|
|
67
|
+
float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;
|
|
68
|
+
float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;
|
|
69
|
+
float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;
|
|
70
|
+
float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;
|
|
71
|
+
float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;
|
|
72
|
+
|
|
73
|
+
float dl = abs((2.0 * l1 - l2) - c0);
|
|
74
|
+
float dr = abs((2.0 * r1 - r2) - c0);
|
|
75
|
+
float db = abs((2.0 * b1 - b2) - c0);
|
|
76
|
+
float dt = abs((2.0 * t1 - t2) - c0);
|
|
77
|
+
|
|
78
|
+
vec3 ce = getWorldPos(c0, vUv).xyz;
|
|
79
|
+
|
|
80
|
+
vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz
|
|
81
|
+
: -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;
|
|
82
|
+
vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz
|
|
83
|
+
: -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;
|
|
84
|
+
|
|
85
|
+
return normalize(cross(dpdx, dpdy));
|
|
86
|
+
}
|
|
87
|
+
void main() {
|
|
88
|
+
vec2 uv = vUv - vec2(0.5) / resolution;
|
|
89
|
+
vec2 pixelSize = vec2(1.0) / resolution;
|
|
90
|
+
vec2[] uvSamples = vec2[4](
|
|
91
|
+
uv,
|
|
92
|
+
uv + vec2(pixelSize.x, 0.0),
|
|
93
|
+
uv + vec2(0.0, pixelSize.y),
|
|
94
|
+
uv + pixelSize
|
|
95
|
+
);
|
|
96
|
+
float depth00 = texture2D(sceneDepth, uvSamples[0]).r;
|
|
97
|
+
float depth10 = texture2D(sceneDepth, uvSamples[1]).r;
|
|
98
|
+
float depth01 = texture2D(sceneDepth, uvSamples[2]).r;
|
|
99
|
+
float depth11 = texture2D(sceneDepth, uvSamples[3]).r;
|
|
100
|
+
float minDepth = min(min(depth00, depth10), min(depth01, depth11));
|
|
101
|
+
float maxDepth = max(max(depth00, depth10), max(depth01, depth11));
|
|
102
|
+
float targetDepth = minDepth;
|
|
103
|
+
// Checkerboard pattern to avoid artifacts
|
|
104
|
+
if (mod(gl_FragCoord.x + gl_FragCoord.y, 2.0) > 0.5) {
|
|
105
|
+
targetDepth = maxDepth;
|
|
106
|
+
}
|
|
107
|
+
int chosenIndex = 0;
|
|
108
|
+
float[] samples = float[4](depth00, depth10, depth01, depth11);
|
|
109
|
+
for(int i = 0; i < 4; ++i) {
|
|
110
|
+
if (samples[i] == targetDepth) {
|
|
111
|
+
chosenIndex = i;
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
gl_FragColor = vec4(samples[chosenIndex], 0.0, 0.0, 1.0);
|
|
116
|
+
gNormal = vec4(computeNormal(
|
|
117
|
+
getWorldPos(samples[chosenIndex], uvSamples[chosenIndex]), uvSamples[chosenIndex]
|
|
118
|
+
), 0.0);
|
|
119
|
+
/* float[] samples = float[4](depth00, depth10, depth01, depth11);
|
|
120
|
+
float c = 0.25 * (depth00 + depth10 + depth01 + depth11);
|
|
121
|
+
float[] distances = float[4](depth00, depth10, depth01, depth11);
|
|
122
|
+
float maxDistance = max(max(distances[0], distances[1]), max(distances[2], distances[3]));
|
|
123
|
+
|
|
124
|
+
int remaining[3];
|
|
125
|
+
int rejected[3];
|
|
126
|
+
int i, j, k;
|
|
127
|
+
|
|
128
|
+
for(i = 0, j = 0, k = 0; i < 4; ++i) {
|
|
129
|
+
if (distances[i] < maxDistance) {
|
|
130
|
+
remaining[j++] = i;
|
|
131
|
+
} else {
|
|
132
|
+
rejected[k++] = i;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
for(;j < 3;++j) {
|
|
136
|
+
remaining[j] = rejected[--k];
|
|
137
|
+
}
|
|
138
|
+
vec3 s = vec3(
|
|
139
|
+
samples[remaining[0]],
|
|
140
|
+
samples[remaining[1]],
|
|
141
|
+
samples[remaining[2]]
|
|
142
|
+
);
|
|
143
|
+
c = (s.x + s.y + s.z) / 3.0;
|
|
144
|
+
|
|
145
|
+
distances[0] = abs(c - s.x);
|
|
146
|
+
distances[1] = abs(c - s.y);
|
|
147
|
+
distances[2] = abs(c - s.z);
|
|
148
|
+
|
|
149
|
+
float minDistance = min(min(distances[0], distances[1]), distances[2]);
|
|
150
|
+
|
|
151
|
+
for(i = 0; i < 3; ++i) {
|
|
152
|
+
if (distances[i] == minDistance) {
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}*/
|
|
156
|
+
/* gl_FragColor = vec4(samples[remaining[i]], 0.0, 0.0, 0.0);
|
|
157
|
+
gNormal = vec4(computeNormal(
|
|
158
|
+
getWorldPos(samples[remaining[i]], uvSamples[remaining[i]]), uvSamples[remaining[i]]
|
|
159
|
+
), 0.0);*/
|
|
160
|
+
}`
|
|
161
|
+
)
|
|
162
|
+
};
|
|
163
|
+
export {
|
|
164
|
+
DepthDownSample
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=DepthDownSample.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DepthDownSample.js","sources":["../../../src/effects/N8AO/DepthDownSample.js"],"sourcesContent":["import * as THREE from 'three'\n\nconst DepthDownSample = {\n uniforms: {\n sceneDepth: { value: null },\n resolution: { value: new THREE.Vector2() },\n near: { value: 0.1 },\n far: { value: 1000.0 },\n viewMatrixInv: { value: new THREE.Matrix4() },\n projectionMatrixInv: { value: new THREE.Matrix4() },\n logDepth: { value: false },\n },\n depthWrite: false,\n depthTest: false,\n\n vertexShader: /* glsl */ `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position, 1);\n }`,\n fragmentShader: /* glsl */ `\n uniform highp sampler2D sceneDepth;\n uniform vec2 resolution;\n uniform float near;\n uniform float far;\n uniform bool logDepth;\n uniform mat4 viewMatrixInv;\n uniform mat4 projectionMatrixInv;\n varying vec2 vUv;\n layout(location = 1) out vec4 gNormal;\n vec3 getWorldPosLog(vec3 posS) {\n vec2 uv = posS.xy;\n float z = posS.z;\n float nearZ =near;\n float farZ = far;\n float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;\n vec4 wpos = projectionMatrixInv * clipVec;\n return wpos.xyz / wpos.w;\n }\n vec3 getWorldPos(float depth, vec2 coord) {\n if (logDepth) {\n return getWorldPosLog(vec3(coord, depth));\n }\n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;\n // Perspective division\n vec4 worldSpacePosition = viewSpacePosition;\n worldSpacePosition.xyz /= worldSpacePosition.w;\n return worldSpacePosition.xyz;\n }\n \n vec3 computeNormal(vec3 worldPos, vec2 vUv) {\n ivec2 p = ivec2(vUv * resolution);\n float c0 = texelFetch(sceneDepth, p, 0).x;\n float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;\n float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;\n float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;\n float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;\n float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;\n float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;\n float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;\n float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;\n \n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n \n vec3 ce = getWorldPos(c0, vUv).xyz;\n \n vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz\n : -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;\n vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz\n : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;\n \n return normalize(cross(dpdx, dpdy));\n }\n void main() {\n vec2 uv = vUv - vec2(0.5) / resolution;\n vec2 pixelSize = vec2(1.0) / resolution;\n vec2[] uvSamples = vec2[4](\n uv,\n uv + vec2(pixelSize.x, 0.0),\n uv + vec2(0.0, pixelSize.y),\n uv + pixelSize\n );\n float depth00 = texture2D(sceneDepth, uvSamples[0]).r;\n float depth10 = texture2D(sceneDepth, uvSamples[1]).r;\n float depth01 = texture2D(sceneDepth, uvSamples[2]).r;\n float depth11 = texture2D(sceneDepth, uvSamples[3]).r;\n float minDepth = min(min(depth00, depth10), min(depth01, depth11));\n float maxDepth = max(max(depth00, depth10), max(depth01, depth11));\n float targetDepth = minDepth;\n // Checkerboard pattern to avoid artifacts\n if (mod(gl_FragCoord.x + gl_FragCoord.y, 2.0) > 0.5) { \n targetDepth = maxDepth;\n }\n int chosenIndex = 0;\n float[] samples = float[4](depth00, depth10, depth01, depth11);\n for(int i = 0; i < 4; ++i) {\n if (samples[i] == targetDepth) {\n chosenIndex = i;\n break;\n }\n }\n gl_FragColor = vec4(samples[chosenIndex], 0.0, 0.0, 1.0);\n gNormal = vec4(computeNormal(\n getWorldPos(samples[chosenIndex], uvSamples[chosenIndex]), uvSamples[chosenIndex]\n ), 0.0);\n /* float[] samples = float[4](depth00, depth10, depth01, depth11);\n float c = 0.25 * (depth00 + depth10 + depth01 + depth11);\n float[] distances = float[4](depth00, depth10, depth01, depth11);\n float maxDistance = max(max(distances[0], distances[1]), max(distances[2], distances[3]));\n\n int remaining[3];\n int rejected[3];\n int i, j, k;\n\n for(i = 0, j = 0, k = 0; i < 4; ++i) {\n if (distances[i] < maxDistance) {\n remaining[j++] = i;\n } else {\n rejected[k++] = i;\n }\n }\n for(;j < 3;++j) {\n remaining[j] = rejected[--k];\n }\n vec3 s = vec3(\n samples[remaining[0]],\n samples[remaining[1]],\n samples[remaining[2]]\n );\n c = (s.x + s.y + s.z) / 3.0;\n\n distances[0] = abs(c - s.x);\n distances[1] = abs(c - s.y);\n distances[2] = abs(c - s.z);\n\n float minDistance = min(min(distances[0], distances[1]), distances[2]);\n\n for(i = 0; i < 3; ++i) {\n if (distances[i] == minDistance) {\n break;\n }\n }*/\n /* gl_FragColor = vec4(samples[remaining[i]], 0.0, 0.0, 0.0);\n gNormal = vec4(computeNormal(\n getWorldPos(samples[remaining[i]], uvSamples[remaining[i]]), uvSamples[remaining[i]]\n ), 0.0);*/\n }`,\n}\n\nexport { DepthDownSample }\n"],"names":[],"mappings":";AAEK,MAAC,kBAAkB;AAAA,EACtB,UAAU;AAAA,IACR,YAAY,EAAE,OAAO,KAAM;AAAA,IAC3B,YAAY,EAAE,OAAO,IAAI,MAAM,QAAO,EAAI;AAAA,IAC1C,MAAM,EAAE,OAAO,IAAK;AAAA,IACpB,KAAK,EAAE,OAAO,IAAQ;AAAA,IACtB,eAAe,EAAE,OAAO,IAAI,MAAM,QAAO,EAAI;AAAA,IAC7C,qBAAqB,EAAE,OAAO,IAAI,MAAM,QAAO,EAAI;AAAA,IACnD,UAAU,EAAE,OAAO,MAAO;AAAA,EAC3B;AAAA,EACD,YAAY;AAAA,EACZ,WAAW;AAAA,EAEX;AAAA;AAAA,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwI7B;"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const THREE = require("three");
|
|
4
|
+
function _interopNamespaceDefault(e) {
|
|
5
|
+
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
|
6
|
+
if (e) {
|
|
7
|
+
for (const k in e) {
|
|
8
|
+
if (k !== "default") {
|
|
9
|
+
const d = Object.getOwnPropertyDescriptor(e, k);
|
|
10
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: () => e[k]
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
n.default = e;
|
|
18
|
+
return Object.freeze(n);
|
|
19
|
+
}
|
|
20
|
+
const THREE__namespace = /* @__PURE__ */ _interopNamespaceDefault(THREE);
|
|
21
|
+
const EffectCompositer = {
|
|
22
|
+
uniforms: {
|
|
23
|
+
sceneDiffuse: { value: null },
|
|
24
|
+
sceneDepth: { value: null },
|
|
25
|
+
tDiffuse: { value: null },
|
|
26
|
+
projMat: { value: new THREE__namespace.Matrix4() },
|
|
27
|
+
viewMat: { value: new THREE__namespace.Matrix4() },
|
|
28
|
+
projectionMatrixInv: { value: new THREE__namespace.Matrix4() },
|
|
29
|
+
viewMatrixInv: { value: new THREE__namespace.Matrix4() },
|
|
30
|
+
cameraPos: { value: new THREE__namespace.Vector3() },
|
|
31
|
+
resolution: { value: new THREE__namespace.Vector2() },
|
|
32
|
+
color: { value: new THREE__namespace.Vector3(0, 0, 0) },
|
|
33
|
+
blueNoise: { value: null },
|
|
34
|
+
downsampledDepth: { value: null },
|
|
35
|
+
time: { value: 0 },
|
|
36
|
+
intensity: { value: 10 },
|
|
37
|
+
renderMode: { value: 0 },
|
|
38
|
+
gammaCorrection: { value: false },
|
|
39
|
+
logDepth: { value: false },
|
|
40
|
+
ortho: { value: false },
|
|
41
|
+
near: { value: 0.1 },
|
|
42
|
+
far: { value: 1e3 },
|
|
43
|
+
screenSpaceRadius: { value: false },
|
|
44
|
+
radius: { value: 0 },
|
|
45
|
+
distanceFalloff: { value: 1 },
|
|
46
|
+
fog: { value: false },
|
|
47
|
+
fogExp: { value: false },
|
|
48
|
+
fogDensity: { value: 0 },
|
|
49
|
+
fogNear: { value: Infinity },
|
|
50
|
+
fogFar: { value: Infinity },
|
|
51
|
+
colorMultiply: { value: true }
|
|
52
|
+
},
|
|
53
|
+
depthWrite: false,
|
|
54
|
+
depthTest: false,
|
|
55
|
+
vertexShader: (
|
|
56
|
+
/* glsl */
|
|
57
|
+
`
|
|
58
|
+
varying vec2 vUv;
|
|
59
|
+
void main() {
|
|
60
|
+
vUv = uv;
|
|
61
|
+
gl_Position = vec4(position, 1);
|
|
62
|
+
}`
|
|
63
|
+
),
|
|
64
|
+
fragmentShader: (
|
|
65
|
+
/* glsl */
|
|
66
|
+
`
|
|
67
|
+
uniform sampler2D sceneDiffuse;
|
|
68
|
+
uniform highp sampler2D sceneDepth;
|
|
69
|
+
uniform highp sampler2D downsampledDepth;
|
|
70
|
+
uniform sampler2D tDiffuse;
|
|
71
|
+
uniform sampler2D blueNoise;
|
|
72
|
+
uniform vec2 resolution;
|
|
73
|
+
uniform vec3 color;
|
|
74
|
+
uniform mat4 projectionMatrixInv;
|
|
75
|
+
uniform mat4 viewMatrixInv;
|
|
76
|
+
uniform float intensity;
|
|
77
|
+
uniform float renderMode;
|
|
78
|
+
uniform float near;
|
|
79
|
+
uniform float far;
|
|
80
|
+
uniform bool gammaCorrection;
|
|
81
|
+
uniform bool logDepth;
|
|
82
|
+
uniform bool ortho;
|
|
83
|
+
uniform bool screenSpaceRadius;
|
|
84
|
+
uniform bool fog;
|
|
85
|
+
uniform bool fogExp;
|
|
86
|
+
uniform bool colorMultiply;
|
|
87
|
+
uniform float fogDensity;
|
|
88
|
+
uniform float fogNear;
|
|
89
|
+
uniform float fogFar;
|
|
90
|
+
uniform float radius;
|
|
91
|
+
uniform float distanceFalloff;
|
|
92
|
+
uniform vec3 cameraPos;
|
|
93
|
+
varying vec2 vUv;
|
|
94
|
+
highp float linearize_depth(highp float d, highp float zNear,highp float zFar)
|
|
95
|
+
{
|
|
96
|
+
return (zFar * zNear) / (zFar - d * (zFar - zNear));
|
|
97
|
+
}
|
|
98
|
+
highp float linearize_depth_ortho(highp float d, highp float nearZ, highp float farZ) {
|
|
99
|
+
return nearZ + (farZ - nearZ) * d;
|
|
100
|
+
}
|
|
101
|
+
highp float linearize_depth_log(highp float d, highp float nearZ,highp float farZ) {
|
|
102
|
+
float depth = pow(2.0, d * log2(farZ + 1.0)) - 1.0;
|
|
103
|
+
float a = farZ / (farZ - nearZ);
|
|
104
|
+
float b = farZ * nearZ / (nearZ - farZ);
|
|
105
|
+
float linDepth = a + b / depth;
|
|
106
|
+
return ortho ? linearize_depth_ortho(
|
|
107
|
+
linDepth,
|
|
108
|
+
nearZ,
|
|
109
|
+
farZ
|
|
110
|
+
) :linearize_depth(linDepth, nearZ, farZ);
|
|
111
|
+
}
|
|
112
|
+
vec3 getWorldPosLog(vec3 posS) {
|
|
113
|
+
vec2 uv = posS.xy;
|
|
114
|
+
float z = posS.z;
|
|
115
|
+
float nearZ =near;
|
|
116
|
+
float farZ = far;
|
|
117
|
+
float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;
|
|
118
|
+
float a = farZ / (farZ - nearZ);
|
|
119
|
+
float b = farZ * nearZ / (nearZ - farZ);
|
|
120
|
+
float linDepth = a + b / depth;
|
|
121
|
+
vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;
|
|
122
|
+
vec4 wpos = projectionMatrixInv * clipVec;
|
|
123
|
+
return wpos.xyz / wpos.w;
|
|
124
|
+
}
|
|
125
|
+
vec3 getWorldPos(float depth, vec2 coord) {
|
|
126
|
+
// if (logDepth) {
|
|
127
|
+
#ifdef LOGDEPTH
|
|
128
|
+
return getWorldPosLog(vec3(coord, depth));
|
|
129
|
+
#endif
|
|
130
|
+
// }
|
|
131
|
+
float z = depth * 2.0 - 1.0;
|
|
132
|
+
vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);
|
|
133
|
+
vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;
|
|
134
|
+
// Perspective division
|
|
135
|
+
vec4 worldSpacePosition = viewSpacePosition;
|
|
136
|
+
worldSpacePosition.xyz /= worldSpacePosition.w;
|
|
137
|
+
return worldSpacePosition.xyz;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
vec3 computeNormal(vec3 worldPos, vec2 vUv) {
|
|
141
|
+
ivec2 p = ivec2(vUv * resolution);
|
|
142
|
+
float c0 = texelFetch(sceneDepth, p, 0).x;
|
|
143
|
+
float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;
|
|
144
|
+
float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;
|
|
145
|
+
float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;
|
|
146
|
+
float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;
|
|
147
|
+
float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;
|
|
148
|
+
float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;
|
|
149
|
+
float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;
|
|
150
|
+
float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;
|
|
151
|
+
|
|
152
|
+
float dl = abs((2.0 * l1 - l2) - c0);
|
|
153
|
+
float dr = abs((2.0 * r1 - r2) - c0);
|
|
154
|
+
float db = abs((2.0 * b1 - b2) - c0);
|
|
155
|
+
float dt = abs((2.0 * t1 - t2) - c0);
|
|
156
|
+
|
|
157
|
+
vec3 ce = getWorldPos(c0, vUv).xyz;
|
|
158
|
+
|
|
159
|
+
vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz
|
|
160
|
+
: -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;
|
|
161
|
+
vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz
|
|
162
|
+
: -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;
|
|
163
|
+
|
|
164
|
+
return normalize(cross(dpdx, dpdy));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
#include <common>
|
|
168
|
+
#include <dithering_pars_fragment>
|
|
169
|
+
void main() {
|
|
170
|
+
//vec4 texel = texture2D(tDiffuse, vUv);//vec3(0.0);
|
|
171
|
+
vec4 sceneTexel = texture2D(sceneDiffuse, vUv);
|
|
172
|
+
float depth = texture2D(
|
|
173
|
+
sceneDepth,
|
|
174
|
+
vUv
|
|
175
|
+
).x;
|
|
176
|
+
#ifdef HALFRES
|
|
177
|
+
vec4 texel;
|
|
178
|
+
if (depth == 1.0) {
|
|
179
|
+
texel = vec4(0.0, 0.0, 0.0, 1.0);
|
|
180
|
+
} else {
|
|
181
|
+
vec3 worldPos = getWorldPos(depth, vUv);
|
|
182
|
+
vec3 normal = computeNormal(getWorldPos(depth, vUv), vUv);
|
|
183
|
+
// vec4 texel = texture2D(tDiffuse, vUv);
|
|
184
|
+
// Find closest depth;
|
|
185
|
+
float totalWeight = 0.0;
|
|
186
|
+
float radiusToUse = screenSpaceRadius ? distance(
|
|
187
|
+
worldPos,
|
|
188
|
+
getWorldPos(depth, vUv +
|
|
189
|
+
vec2(radius, 0.0) / resolution)
|
|
190
|
+
) : radius;
|
|
191
|
+
float distanceFalloffToUse =screenSpaceRadius ?
|
|
192
|
+
radiusToUse * distanceFalloff
|
|
193
|
+
: distanceFalloff;
|
|
194
|
+
for(float x = -1.0; x <= 1.0; x++) {
|
|
195
|
+
for(float y = -1.0; y <= 1.0; y++) {
|
|
196
|
+
vec2 offset = vec2(x, y);
|
|
197
|
+
ivec2 p = ivec2(
|
|
198
|
+
(vUv * resolution * 0.5) + offset
|
|
199
|
+
);
|
|
200
|
+
vec2 pUv = vec2(p) / (resolution * 0.5);
|
|
201
|
+
float sampleDepth = texelFetch(downsampledDepth,p, 0).x;
|
|
202
|
+
vec4 sampleInfo = texelFetch(tDiffuse, p, 0);
|
|
203
|
+
vec3 normalSample = sampleInfo.xyz * 2.0 - 1.0;
|
|
204
|
+
vec3 worldPosSample = getWorldPos(sampleDepth, pUv);
|
|
205
|
+
float tangentPlaneDist = abs(dot(worldPos - worldPosSample, normal));
|
|
206
|
+
float rangeCheck = exp(-1.0 * tangentPlaneDist * (1.0 / distanceFalloffToUse)) * max(dot(normal, normalSample), 0.0);
|
|
207
|
+
float weight = rangeCheck;
|
|
208
|
+
totalWeight += weight;
|
|
209
|
+
texel += sampleInfo * weight;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (totalWeight == 0.0) {
|
|
213
|
+
texel = texture2D(tDiffuse, vUv);
|
|
214
|
+
} else {
|
|
215
|
+
texel /= totalWeight;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
#else
|
|
219
|
+
vec4 texel = texture2D(tDiffuse, vUv);
|
|
220
|
+
#endif
|
|
221
|
+
|
|
222
|
+
#ifdef LOGDEPTH
|
|
223
|
+
texel.a = clamp(texel.a, 0.0, 1.0);
|
|
224
|
+
if (texel.a == 0.0) {
|
|
225
|
+
texel.a = 1.0;
|
|
226
|
+
}
|
|
227
|
+
#endif
|
|
228
|
+
|
|
229
|
+
float finalAo = pow(texel.a, intensity);
|
|
230
|
+
float fogFactor;
|
|
231
|
+
float fogDepth = distance(
|
|
232
|
+
cameraPos,
|
|
233
|
+
getWorldPos(depth, vUv)
|
|
234
|
+
);
|
|
235
|
+
if (fog) {
|
|
236
|
+
if (fogExp) {
|
|
237
|
+
fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );
|
|
238
|
+
} else {
|
|
239
|
+
fogFactor = smoothstep( fogNear, fogFar, fogDepth );
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
finalAo = mix(finalAo, 1.0, fogFactor);
|
|
243
|
+
vec3 aoApplied = color * mix(vec3(1.0), sceneTexel.rgb, float(colorMultiply));
|
|
244
|
+
if (renderMode == 0.0) {
|
|
245
|
+
gl_FragColor = vec4( mix(sceneTexel.rgb, aoApplied, 1.0 - finalAo), sceneTexel.a);
|
|
246
|
+
} else if (renderMode == 1.0) {
|
|
247
|
+
gl_FragColor = vec4( mix(vec3(1.0), aoApplied, 1.0 - finalAo), sceneTexel.a);
|
|
248
|
+
} else if (renderMode == 2.0) {
|
|
249
|
+
gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);
|
|
250
|
+
} else if (renderMode == 3.0) {
|
|
251
|
+
if (vUv.x < 0.5) {
|
|
252
|
+
gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);
|
|
253
|
+
} else if (abs(vUv.x - 0.5) < 1.0 / resolution.x) {
|
|
254
|
+
gl_FragColor = vec4(1.0);
|
|
255
|
+
} else {
|
|
256
|
+
gl_FragColor = vec4( mix(sceneTexel.rgb, aoApplied, 1.0 - finalAo), sceneTexel.a);
|
|
257
|
+
}
|
|
258
|
+
} else if (renderMode == 4.0) {
|
|
259
|
+
if (vUv.x < 0.5) {
|
|
260
|
+
gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);
|
|
261
|
+
} else if (abs(vUv.x - 0.5) < 1.0 / resolution.x) {
|
|
262
|
+
gl_FragColor = vec4(1.0);
|
|
263
|
+
} else {
|
|
264
|
+
gl_FragColor = vec4( mix(vec3(1.0), aoApplied, 1.0 - finalAo), sceneTexel.a);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
#include <dithering_fragment>
|
|
268
|
+
if (gammaCorrection) {
|
|
269
|
+
gl_FragColor = LinearTosRGB(gl_FragColor);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
`
|
|
273
|
+
)
|
|
274
|
+
};
|
|
275
|
+
exports.EffectCompositer = EffectCompositer;
|
|
276
|
+
//# sourceMappingURL=EffectCompositer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EffectCompositer.cjs","sources":["../../../src/effects/N8AO/EffectCompositer.js"],"sourcesContent":["import * as THREE from 'three'\n\nconst EffectCompositer = {\n uniforms: {\n sceneDiffuse: { value: null },\n sceneDepth: { value: null },\n tDiffuse: { value: null },\n projMat: { value: new THREE.Matrix4() },\n viewMat: { value: new THREE.Matrix4() },\n projectionMatrixInv: { value: new THREE.Matrix4() },\n viewMatrixInv: { value: new THREE.Matrix4() },\n cameraPos: { value: new THREE.Vector3() },\n resolution: { value: new THREE.Vector2() },\n color: { value: new THREE.Vector3(0, 0, 0) },\n blueNoise: { value: null },\n downsampledDepth: { value: null },\n time: { value: 0.0 },\n intensity: { value: 10.0 },\n renderMode: { value: 0.0 },\n gammaCorrection: { value: false },\n logDepth: { value: false },\n ortho: { value: false },\n near: { value: 0.1 },\n far: { value: 1000.0 },\n screenSpaceRadius: { value: false },\n radius: { value: 0.0 },\n distanceFalloff: { value: 1.0 },\n fog: { value: false },\n fogExp: { value: false },\n fogDensity: { value: 0.0 },\n fogNear: { value: Infinity },\n fogFar: { value: Infinity },\n colorMultiply: { value: true },\n },\n depthWrite: false,\n depthTest: false,\n\n vertexShader: /* glsl */ `\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = vec4(position, 1);\n\t\t}`,\n fragmentShader: /* glsl */ `\n\t\tuniform sampler2D sceneDiffuse;\n uniform highp sampler2D sceneDepth;\n uniform highp sampler2D downsampledDepth;\n uniform sampler2D tDiffuse;\n uniform sampler2D blueNoise;\n uniform vec2 resolution;\n uniform vec3 color;\n uniform mat4 projectionMatrixInv;\n uniform mat4 viewMatrixInv;\n uniform float intensity;\n uniform float renderMode;\n uniform float near;\n uniform float far;\n uniform bool gammaCorrection;\n uniform bool logDepth;\n uniform bool ortho;\n uniform bool screenSpaceRadius;\n uniform bool fog;\n uniform bool fogExp;\n uniform bool colorMultiply;\n uniform float fogDensity;\n uniform float fogNear;\n uniform float fogFar;\n uniform float radius;\n uniform float distanceFalloff;\n uniform vec3 cameraPos;\n varying vec2 vUv;\n highp float linearize_depth(highp float d, highp float zNear,highp float zFar)\n {\n return (zFar * zNear) / (zFar - d * (zFar - zNear));\n }\n highp float linearize_depth_ortho(highp float d, highp float nearZ, highp float farZ) {\n return nearZ + (farZ - nearZ) * d;\n }\n highp float linearize_depth_log(highp float d, highp float nearZ,highp float farZ) {\n float depth = pow(2.0, d * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n return ortho ? linearize_depth_ortho(\n linDepth,\n nearZ,\n farZ\n ) :linearize_depth(linDepth, nearZ, farZ);\n }\n vec3 getWorldPosLog(vec3 posS) {\n vec2 uv = posS.xy;\n float z = posS.z;\n float nearZ =near;\n float farZ = far;\n float depth = pow(2.0, z * log2(farZ + 1.0)) - 1.0;\n float a = farZ / (farZ - nearZ);\n float b = farZ * nearZ / (nearZ - farZ);\n float linDepth = a + b / depth;\n vec4 clipVec = vec4(uv, linDepth, 1.0) * 2.0 - 1.0;\n vec4 wpos = projectionMatrixInv * clipVec;\n return wpos.xyz / wpos.w;\n }\n vec3 getWorldPos(float depth, vec2 coord) {\n // if (logDepth) {\n #ifdef LOGDEPTH\n return getWorldPosLog(vec3(coord, depth));\n #endif\n // }\n float z = depth * 2.0 - 1.0;\n vec4 clipSpacePosition = vec4(coord * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = projectionMatrixInv * clipSpacePosition;\n // Perspective division\n vec4 worldSpacePosition = viewSpacePosition;\n worldSpacePosition.xyz /= worldSpacePosition.w;\n return worldSpacePosition.xyz;\n }\n \n vec3 computeNormal(vec3 worldPos, vec2 vUv) {\n ivec2 p = ivec2(vUv * resolution);\n float c0 = texelFetch(sceneDepth, p, 0).x;\n float l2 = texelFetch(sceneDepth, p - ivec2(2, 0), 0).x;\n float l1 = texelFetch(sceneDepth, p - ivec2(1, 0), 0).x;\n float r1 = texelFetch(sceneDepth, p + ivec2(1, 0), 0).x;\n float r2 = texelFetch(sceneDepth, p + ivec2(2, 0), 0).x;\n float b2 = texelFetch(sceneDepth, p - ivec2(0, 2), 0).x;\n float b1 = texelFetch(sceneDepth, p - ivec2(0, 1), 0).x;\n float t1 = texelFetch(sceneDepth, p + ivec2(0, 1), 0).x;\n float t2 = texelFetch(sceneDepth, p + ivec2(0, 2), 0).x;\n \n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n \n vec3 ce = getWorldPos(c0, vUv).xyz;\n \n vec3 dpdx = (dl < dr) ? ce - getWorldPos(l1, (vUv - vec2(1.0 / resolution.x, 0.0))).xyz\n : -ce + getWorldPos(r1, (vUv + vec2(1.0 / resolution.x, 0.0))).xyz;\n vec3 dpdy = (db < dt) ? ce - getWorldPos(b1, (vUv - vec2(0.0, 1.0 / resolution.y))).xyz\n : -ce + getWorldPos(t1, (vUv + vec2(0.0, 1.0 / resolution.y))).xyz;\n \n return normalize(cross(dpdx, dpdy));\n }\n\n #include <common>\n #include <dithering_pars_fragment>\n void main() {\n //vec4 texel = texture2D(tDiffuse, vUv);//vec3(0.0);\n vec4 sceneTexel = texture2D(sceneDiffuse, vUv);\n float depth = texture2D(\n sceneDepth,\n vUv\n ).x;\n #ifdef HALFRES \n vec4 texel;\n if (depth == 1.0) {\n texel = vec4(0.0, 0.0, 0.0, 1.0);\n } else {\n vec3 worldPos = getWorldPos(depth, vUv);\n vec3 normal = computeNormal(getWorldPos(depth, vUv), vUv);\n // vec4 texel = texture2D(tDiffuse, vUv);\n // Find closest depth;\n float totalWeight = 0.0;\n float radiusToUse = screenSpaceRadius ? distance(\n worldPos,\n getWorldPos(depth, vUv +\n vec2(radius, 0.0) / resolution)\n ) : radius;\n float distanceFalloffToUse =screenSpaceRadius ?\n radiusToUse * distanceFalloff\n : distanceFalloff;\n for(float x = -1.0; x <= 1.0; x++) {\n for(float y = -1.0; y <= 1.0; y++) {\n vec2 offset = vec2(x, y);\n ivec2 p = ivec2(\n (vUv * resolution * 0.5) + offset\n );\n vec2 pUv = vec2(p) / (resolution * 0.5);\n float sampleDepth = texelFetch(downsampledDepth,p, 0).x;\n vec4 sampleInfo = texelFetch(tDiffuse, p, 0);\n vec3 normalSample = sampleInfo.xyz * 2.0 - 1.0;\n vec3 worldPosSample = getWorldPos(sampleDepth, pUv);\n float tangentPlaneDist = abs(dot(worldPos - worldPosSample, normal));\n float rangeCheck = exp(-1.0 * tangentPlaneDist * (1.0 / distanceFalloffToUse)) * max(dot(normal, normalSample), 0.0);\n float weight = rangeCheck;\n totalWeight += weight;\n texel += sampleInfo * weight;\n }\n }\n if (totalWeight == 0.0) {\n texel = texture2D(tDiffuse, vUv);\n } else {\n texel /= totalWeight;\n }\n }\n #else\n vec4 texel = texture2D(tDiffuse, vUv);\n #endif\n\n #ifdef LOGDEPTH\n texel.a = clamp(texel.a, 0.0, 1.0);\n if (texel.a == 0.0) {\n texel.a = 1.0;\n }\n #endif\n \n float finalAo = pow(texel.a, intensity);\n float fogFactor;\n float fogDepth = distance(\n cameraPos,\n getWorldPos(depth, vUv)\n );\n if (fog) {\n if (fogExp) {\n fogFactor = 1.0 - exp( - fogDensity * fogDensity * fogDepth * fogDepth );\n } else {\n fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n }\n }\n finalAo = mix(finalAo, 1.0, fogFactor);\n vec3 aoApplied = color * mix(vec3(1.0), sceneTexel.rgb, float(colorMultiply));\n if (renderMode == 0.0) {\n gl_FragColor = vec4( mix(sceneTexel.rgb, aoApplied, 1.0 - finalAo), sceneTexel.a);\n } else if (renderMode == 1.0) {\n gl_FragColor = vec4( mix(vec3(1.0), aoApplied, 1.0 - finalAo), sceneTexel.a);\n } else if (renderMode == 2.0) {\n gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);\n } else if (renderMode == 3.0) {\n if (vUv.x < 0.5) {\n gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);\n } else if (abs(vUv.x - 0.5) < 1.0 / resolution.x) {\n gl_FragColor = vec4(1.0);\n } else {\n gl_FragColor = vec4( mix(sceneTexel.rgb, aoApplied, 1.0 - finalAo), sceneTexel.a);\n }\n } else if (renderMode == 4.0) {\n if (vUv.x < 0.5) {\n gl_FragColor = vec4( sceneTexel.rgb, sceneTexel.a);\n } else if (abs(vUv.x - 0.5) < 1.0 / resolution.x) {\n gl_FragColor = vec4(1.0);\n } else {\n gl_FragColor = vec4( mix(vec3(1.0), aoApplied, 1.0 - finalAo), sceneTexel.a);\n }\n }\n #include <dithering_fragment>\n if (gammaCorrection) {\n gl_FragColor = LinearTosRGB(gl_FragColor);\n }\n }\n `,\n}\n\nexport { EffectCompositer }\n"],"names":["THREE"],"mappings":";;;;;;;;;;;;;;;;;;;;AAEK,MAAC,mBAAmB;AAAA,EACvB,UAAU;AAAA,IACR,cAAc,EAAE,OAAO,KAAM;AAAA,IAC7B,YAAY,EAAE,OAAO,KAAM;AAAA,IAC3B,UAAU,EAAE,OAAO,KAAM;AAAA,IACzB,SAAS,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IACvC,SAAS,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IACvC,qBAAqB,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IACnD,eAAe,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IAC7C,WAAW,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IACzC,YAAY,EAAE,OAAO,IAAIA,iBAAM,QAAO,EAAI;AAAA,IAC1C,OAAO,EAAE,OAAO,IAAIA,iBAAM,QAAQ,GAAG,GAAG,CAAC,EAAG;AAAA,IAC5C,WAAW,EAAE,OAAO,KAAM;AAAA,IAC1B,kBAAkB,EAAE,OAAO,KAAM;AAAA,IACjC,MAAM,EAAE,OAAO,EAAK;AAAA,IACpB,WAAW,EAAE,OAAO,GAAM;AAAA,IAC1B,YAAY,EAAE,OAAO,EAAK;AAAA,IAC1B,iBAAiB,EAAE,OAAO,MAAO;AAAA,IACjC,UAAU,EAAE,OAAO,MAAO;AAAA,IAC1B,OAAO,EAAE,OAAO,MAAO;AAAA,IACvB,MAAM,EAAE,OAAO,IAAK;AAAA,IACpB,KAAK,EAAE,OAAO,IAAQ;AAAA,IACtB,mBAAmB,EAAE,OAAO,MAAO;AAAA,IACnC,QAAQ,EAAE,OAAO,EAAK;AAAA,IACtB,iBAAiB,EAAE,OAAO,EAAK;AAAA,IAC/B,KAAK,EAAE,OAAO,MAAO;AAAA,IACrB,QAAQ,EAAE,OAAO,MAAO;AAAA,IACxB,YAAY,EAAE,OAAO,EAAK;AAAA,IAC1B,SAAS,EAAE,OAAO,SAAU;AAAA,IAC5B,QAAQ,EAAE,OAAO,SAAU;AAAA,IAC3B,eAAe,EAAE,OAAO,KAAM;AAAA,EAC/B;AAAA,EACD,YAAY;AAAA,EACZ,WAAW;AAAA,EAEX;AAAA;AAAA,IAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzB;AAAA;AAAA,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+M7B;;"}
|