diff --git a/src/mol-gl/renderable/schema.ts b/src/mol-gl/renderable/schema.ts index 97fdf372e4b25a6f4cd7f0b991f543025e93ee0d..e206f78069a3b5e5ee5d37503fe029c62521ebc7 100644 --- a/src/mol-gl/renderable/schema.ts +++ b/src/mol-gl/renderable/schema.ts @@ -159,6 +159,7 @@ export const GlobalUniformSchema = { uPixelRatio: UniformSpec('f'), uViewportHeight: UniformSpec('f'), uViewport: UniformSpec('v4'), + uViewOffset: UniformSpec('v2'), uCameraPosition: UniformSpec('v3'), uNear: UniformSpec('f'), diff --git a/src/mol-gl/renderer.ts b/src/mol-gl/renderer.ts index 21093f1342a7967d8c3a0894c72e1ce28259758d..c8af797234542f72d0b0106a736272c7b2af5a87 100644 --- a/src/mol-gl/renderer.ts +++ b/src/mol-gl/renderer.ts @@ -9,7 +9,7 @@ import { Camera } from '../mol-canvas3d/camera'; import Scene from './scene'; import { WebGLContext } from './webgl/context'; -import { Mat4, Vec3, Vec4 } from '../mol-math/linear-algebra'; +import { Mat4, Vec3, Vec4, Vec2 } from '../mol-math/linear-algebra'; import { Renderable } from './renderable'; import { Color } from '../mol-util/color'; import { ValueCell } from '../mol-util'; @@ -73,6 +73,8 @@ namespace Renderer { const modelViewProjection = Mat4.mul(Mat4.identity(), modelView, camera.projection) const invModelViewProjection = Mat4.invert(Mat4.identity(), modelViewProjection) + const viewOffset = camera.viewOffset.enabled ? Vec2.create(camera.viewOffset.offsetX * 16, camera.viewOffset.offsetY * 16) : Vec2() + const globalUniforms: GlobalUniformValues = { uModel: ValueCell.create(Mat4.identity()), uView: ValueCell.create(camera.view), @@ -88,6 +90,7 @@ namespace Renderer { uPixelRatio: ValueCell.create(ctx.pixelRatio), uViewportHeight: ValueCell.create(viewport.height), uViewport: ValueCell.create(Viewport.toVec4(Vec4(), viewport)), + uViewOffset: ValueCell.create(viewOffset), uLightIntensity: ValueCell.create(p.lightIntensity), uAmbientIntensity: ValueCell.create(p.ambientIntensity), @@ -165,6 +168,7 @@ namespace Renderer { ValueCell.update(globalUniforms.uInvModelViewProjection, Mat4.invert(invModelViewProjection, modelViewProjection)) ValueCell.update(globalUniforms.uIsOrtho, camera.state.mode === 'orthographic' ? 1 : 0) + ValueCell.update(globalUniforms.uViewOffset, camera.viewOffset.enabled ? Vec2.set(viewOffset, camera.viewOffset.offsetX * 16, camera.viewOffset.offsetY * 16) : Vec2.set(viewOffset, 0, 0)) ValueCell.update(globalUniforms.uCameraPosition, camera.state.position) ValueCell.update(globalUniforms.uFar, camera.state.far) diff --git a/src/mol-gl/shader/chunks/assign-material-color.glsl.ts b/src/mol-gl/shader/chunks/assign-material-color.glsl.ts index b7157328a4cb89822a825bb7bb39c6179dfab122..c4daf6f6108a8e0065c096fe2a040740d35ed191 100644 --- a/src/mol-gl/shader/chunks/assign-material-color.glsl.ts +++ b/src/mol-gl/shader/chunks/assign-material-color.glsl.ts @@ -23,6 +23,9 @@ export default ` float ta = 1.0 - vTransparency; float at = 0.0; + // shift by view-offset during multi-sample rendering to allow for blending + vec2 coord = gl_FragCoord.xy + uViewOffset * 0.25; + #if defined(dTransparencyVariant_single) const mat4 thresholdMatrix = mat4( 1.0 / 17.0, 9.0 / 17.0, 3.0 / 17.0, 11.0 / 17.0, @@ -30,9 +33,9 @@ export default ` 4.0 / 17.0, 12.0 / 17.0, 2.0 / 17.0, 10.0 / 17.0, 16.0 / 17.0, 8.0 / 17.0, 14.0 / 17.0, 6.0 / 17.0 ); - at = thresholdMatrix[int(intMod(gl_FragCoord.x, 4.0))][int(intMod(gl_FragCoord.y, 4.0))]; + at = thresholdMatrix[int(intMod(coord.x, 4.0))][int(intMod(coord.y, 4.0))]; #elif defined(dTransparencyVariant_multi) - at = fract(dot(vec3(gl_FragCoord.xy, vGroup + 0.5), vec3(2.0, 7.0, 23.0) / 17.0f)); + at = fract(dot(vec3(coord, vGroup + 0.5), vec3(2.0, 7.0, 23.0) / 17.0f)); #endif if (ta < 0.99 && (ta < 0.01 || ta < at)) discard; diff --git a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts index 2d5e35413bf3e85220fec3c63d43b197b339bee4..1d9aedc449b568f80b33f13ce460b86d865bdb4c 100644 --- a/src/mol-gl/shader/chunks/common-frag-params.glsl.ts +++ b/src/mol-gl/shader/chunks/common-frag-params.glsl.ts @@ -9,6 +9,8 @@ varying float vMarker; varying vec3 vViewPosition; +uniform vec2 uViewOffset; + uniform float uFogNear; uniform float uFogFar; uniform vec3 uFogColor;