diff --git a/src/mol-canvas3d/canvas3d.ts b/src/mol-canvas3d/canvas3d.ts index 96483552515c7f4a5c8856c28d159a319e420542..f1a359800c76e52de778cc24e4755f6dfcf5b424 100644 --- a/src/mol-canvas3d/canvas3d.ts +++ b/src/mol-canvas3d/canvas3d.ts @@ -425,7 +425,7 @@ namespace Canvas3D { } if (props.postprocessing.occlusionKernelSize !== undefined) { p.postprocessing.occlusionKernelSize = props.postprocessing.occlusionKernelSize - ValueCell.update(postprocessing.values.uOcclusionKernelSize, props.postprocessing.occlusionKernelSize) + ValueCell.update(postprocessing.values.dOcclusionKernelSize, props.postprocessing.occlusionKernelSize) } if (props.postprocessing.occlusionBias !== undefined) { p.postprocessing.occlusionBias = props.postprocessing.occlusionBias diff --git a/src/mol-canvas3d/helper/postprocessing.ts b/src/mol-canvas3d/helper/postprocessing.ts index d917394514f22048ddc715683529f8ab453373c1..e47c803b8e3e1167bf5f8d6da1370ba3d0aeeeaa 100644 --- a/src/mol-canvas3d/helper/postprocessing.ts +++ b/src/mol-canvas3d/helper/postprocessing.ts @@ -22,7 +22,7 @@ const PostprocessingSchema = { uTexSize: UniformSpec('v2'), dOcclusionEnable: DefineSpec('boolean'), - uOcclusionKernelSize: UniformSpec('i'), + dOcclusionKernelSize: DefineSpec('number'), uOcclusionBias: UniformSpec('f'), uOcclusionRadius: UniformSpec('f'), @@ -52,7 +52,7 @@ export function getPostprocessingRenderable(ctx: WebGLContext, colorTexture: Tex uTexSize: ValueCell.create(Vec2.create(colorTexture.width, colorTexture.height)), dOcclusionEnable: ValueCell.create(p.occlusionEnable), - uOcclusionKernelSize: ValueCell.create(p.occlusionKernelSize), + dOcclusionKernelSize: ValueCell.create(p.occlusionKernelSize), uOcclusionBias: ValueCell.create(p.occlusionBias), uOcclusionRadius: ValueCell.create(p.occlusionRadius), diff --git a/src/mol-gl/shader/postprocessing.frag b/src/mol-gl/shader/postprocessing.frag index e6da74a2f0fb77a5a24d3bf29d3f031dc623566a..7b73d5b70a7b115d7539d57b79e645ec82679cb0 100644 --- a/src/mol-gl/shader/postprocessing.frag +++ b/src/mol-gl/shader/postprocessing.frag @@ -6,7 +6,6 @@ uniform sampler2D tColor; uniform sampler2D tDepth; uniform vec2 uTexSize; -uniform int uOcclusionKernelSize; uniform float uOcclusionBias; uniform float uOcclusionRadius; @@ -28,16 +27,16 @@ float noise(vec2 coords) { float calcSSAO(in vec2 coords, in float depth) { float occlusionFactor = 0.0; - for (int i = -uOcclusionKernelSize; i <= uOcclusionKernelSize; i++) { - for (int j = -uOcclusionKernelSize; j <= uOcclusionKernelSize; j++) { - vec2 coordsDelta = coords + uOcclusionRadius / float(uOcclusionKernelSize) * vec2(float(i) / uTexSize.x, float(j) / uTexSize.y); + for (int i = -dOcclusionKernelSize; i <= dOcclusionKernelSize; i++) { + for (int j = -dOcclusionKernelSize; j <= dOcclusionKernelSize; j++) { + vec2 coordsDelta = coords + uOcclusionRadius / float(dOcclusionKernelSize) * vec2(float(i) / uTexSize.x, float(j) / uTexSize.y); coordsDelta += noiseAmount * (noise(coordsDelta) - 0.5) / uTexSize; coordsDelta = clamp(coordsDelta, 0.5 / uTexSize, 1.0 - 1.0 / uTexSize); if (texture2D(tDepth, coordsDelta).r < depth) occlusionFactor += 1.0; } } - return occlusionFactor / float((2 * uOcclusionKernelSize + 1) * (2 * uOcclusionKernelSize + 1)); + return occlusionFactor / float((2 * dOcclusionKernelSize + 1) * (2 * dOcclusionKernelSize + 1)); } float calcEdgeDepth(in vec2 coords) { @@ -63,10 +62,10 @@ float calcEdgeDepth(in vec2 coords) { void main(void) { vec2 coords = gl_FragCoord.xy / uTexSize; - vec4 color = texture(tColor, coords); + vec4 color = texture2D(tColor, coords); #ifdef dOcclusionEnable - float depth = texture(tDepth, coords).r; + float depth = texture2D(tDepth, coords).r; if (depth != 1.0) { float occlusionFactor = calcSSAO(coords, depth); color = mix(color, vec4(0.0, 0.0, 0.0, 1.0), uOcclusionBias * occlusionFactor);