Merge pull request #216 from cabanier/depth-sensing
update occlusion sample to new depth API
diff --git a/js/render/core/renderer.js b/js/render/core/renderer.js
index 9c60bad..1ed909c 100644
--- a/js/render/core/renderer.js
+++ b/js/render/core/renderer.js
@@ -106,12 +106,13 @@
}
export class RenderView {
- constructor(projectionMatrix, viewTransform, viewport = null, eye = 'left') {
+ constructor(projectionMatrix, viewTransform, viewport = null, eye = 'left', depthdata = null) {
this.projectionMatrix = projectionMatrix;
this.viewport = viewport;
// If an eye isn't given the left eye is assumed.
this._eye = eye;
this._eyeIndex = (eye == 'left' ? 0 : 1);
+ this.depthdata = depthdata;
// Compute the view matrix
if (viewTransform instanceof Float32Array) {
@@ -722,8 +723,8 @@
gl.viewport(vp.x, vp.y, vp.width, vp.height);
gl.uniformMatrix4fv(program.uniform.LEFT_PROJECTION_MATRIX, false, views[0].projectionMatrix);
gl.uniformMatrix4fv(program.uniform.LEFT_VIEW_MATRIX, false, views[0].viewMatrix);
- gl.uniformMatrix4fv(program.uniform.RIGHT_PROJECTION_MATRIX, false, views[0].projectionMatrix);
- gl.uniformMatrix4fv(program.uniform.RIGHT_VIEW_MATRIX, false, views[0].viewMatrix);
+ gl.uniformMatrix4fv(program.uniform.RIGHT_PROJECTION_MATRIX, false, views[1].projectionMatrix);
+ gl.uniformMatrix4fv(program.uniform.RIGHT_VIEW_MATRIX, false, views[1].viewMatrix);
gl.uniform3fv(program.uniform.CAMERA_POSITION, this._cameraPositions[0]);
gl.uniform1i(program.uniform.EYE_INDEX, views[0].eyeIndex);
}
@@ -762,6 +763,19 @@
gl.uniformMatrix4fv(program.uniform.LEFT_VIEW_MATRIX, false, views[0].viewMatrix);
gl.uniformMatrix4fv(program.uniform.RIGHT_PROJECTION_MATRIX, false, views[1].projectionMatrix);
gl.uniformMatrix4fv(program.uniform.RIGHT_VIEW_MATRIX, false, views[1].viewMatrix);
+
+ // for older browser that don't support projectionMatrix and transform on the depth data
+ gl.uniformMatrix4fv(program.uniform.LEFT_DEPTH_PROJECTION_MATRIX, false, views[0].projectionMatrix);
+ gl.uniformMatrix4fv(program.uniform.LEFT_DEPTH_VIEW_MATRIX, false, views[0].viewMatrix);
+ gl.uniformMatrix4fv(program.uniform.RIGHT_DEPTH_PROJECTION_MATRIX, false, views[1].projectionMatrix);
+ gl.uniformMatrix4fv(program.uniform.RIGHT_DEPTH_VIEW_MATRIX, false, views[1].viewMatrix);
+
+ if (view.depthdata && views[0].depthdata.projectionMatrix) {
+ gl.uniformMatrix4fv(program.uniform.LEFT_DEPTH_PROJECTION_MATRIX, false, views[0].depthdata.projectionMatrix);
+ gl.uniformMatrix4fv(program.uniform.LEFT_DEPTH_VIEW_MATRIX, false, views[0].depthdata.transform.inverse.matrix);
+ gl.uniformMatrix4fv(program.uniform.RIGHT_DEPTH_PROJECTION_MATRIX, false, views[1].depthdata.projectionMatrix);
+ gl.uniformMatrix4fv(program.uniform.RIGHT_DEPTH_VIEW_MATRIX, false, views[1].depthdata.transform.inverse.matrix);
+ }
}
// TODO(AB): modify shaders which use CAMERA_POSITION and EYE_INDEX to work with Multiview
gl.uniform3fv(program.uniform.CAMERA_POSITION, this._cameraPositions[i]);
diff --git a/js/render/nodes/cube-sea-occlusion.js b/js/render/nodes/cube-sea-occlusion.js
index 0e6f580..3bd8b0f 100644
--- a/js/render/nodes/cube-sea-occlusion.js
+++ b/js/render/nodes/cube-sea-occlusion.js
@@ -31,6 +31,7 @@
this.baseColor = this.defineSampler('baseColor');
this.depthColor = this.defineSampler('depthColor');
+
}
get materialName() {
@@ -71,6 +72,7 @@
out vec2 vTexCoord;
out vec3 vLight;
+ out vec4 vWorldPosition;
const vec3 lightDir = vec3(0.75, 0.5, 1.0);
const vec3 ambientColor = vec3(0.5, 0.5, 0.5);
@@ -81,8 +83,9 @@
float lightFactor = max(dot(normalize(lightDir), normalRotated), 0.0);
vLight = ambientColor + (lightColor * lightFactor);
vTexCoord = TEXCOORD_0;
- return (VIEW_ID == 0u) ? left_proj * left_view * model * vec4(POSITION, 1.0) :
- right_proj * right_view * model * vec4(POSITION, 1.0);
+ vWorldPosition = model * vec4(POSITION, 1.0);
+ return (VIEW_ID == 0u) ? left_proj * left_view * vWorldPosition :
+ right_proj * right_view * vWorldPosition;
}`;
}
@@ -96,6 +99,8 @@
uniform sampler2DArray depthColor;
in vec2 vTexCoord;
in vec3 vLight;
+ in vec4 vWorldPosition;
+ uniform mat4 LEFT_DEPTH_PROJECTION_MATRIX, LEFT_DEPTH_VIEW_MATRIX, RIGHT_DEPTH_PROJECTION_MATRIX, RIGHT_DEPTH_VIEW_MATRIX;
float Depth_GetCameraDepthInMillimeters(const sampler2DArray depthTexture,
const vec2 depthUv) {
@@ -204,7 +209,10 @@
}
vec4 fragment_main() {
- vec2 depthUv = vec2(gl_FragCoord.x/1680.0, gl_FragCoord.y/1760.0);
+ vec4 depthPosition = (VIEW_ID == 0u) ? LEFT_DEPTH_PROJECTION_MATRIX * LEFT_DEPTH_VIEW_MATRIX * vWorldPosition :
+ RIGHT_DEPTH_PROJECTION_MATRIX * RIGHT_DEPTH_VIEW_MATRIX * vWorldPosition;
+ vec2 depthPositionHC = depthPosition.xy / depthPosition.w;
+ depthPositionHC = vec2 (depthPositionHC.x + 1.0, depthPositionHC.y + 1.0 ) * 0.5;
vec4 o_FragColor = vec4(vLight, 1) * texture(baseColor, vTexCoord);
if (o_FragColor.a == 0.0) {
@@ -215,10 +223,10 @@
float assetDepthMm = gl_FragCoord.z * 1000.0;
float occlusion = Depth_GetBlurredOcclusionAroundUV(
- depthColor, depthUv, assetDepthMm);
+ depthColor, depthPositionHC, assetDepthMm);
//float occlusion = Depth_GetOcclusion(depthColor,
- // depthUv, assetDepthMm);
+ // depthPositionHC, assetDepthMm);
float objectMaskEroded = pow(occlusion, 10.0);
diff --git a/js/render/scenes/scene.js b/js/render/scenes/scene.js
index afc9477..6cea777 100644
--- a/js/render/scenes/scene.js
+++ b/js/render/scenes/scene.js
@@ -26,12 +26,13 @@
import {Ray} from '../math/ray.js';
export class WebXRView extends RenderView {
- constructor(view, layer, viewport) {
+ constructor(view, layer, viewport, depthdata) {
super(
view ? view.projectionMatrix : null,
view ? view.transform : null,
viewport ? viewport : ((layer && view) ? layer.getViewport(view) : null),
- view ? view.eye : 'left'
+ view ? view.eye : 'left',
+ depthdata
);
}
}
diff --git a/layers-samples/proj-multiview-occlusion.html b/layers-samples/proj-multiview-occlusion.html
index fb4121d..6c8a951 100644
--- a/layers-samples/proj-multiview-occlusion.html
+++ b/layers-samples/proj-multiview-occlusion.html
@@ -159,6 +159,7 @@
depthSensing: {
usagePreference: ["gpu-optimized"],
dataFormatPreference: ["unsigned-short"],
+ matchDepthView: false
}}).then((session) => {
xrButton.setSession(session);
session.isImmersive = true;
@@ -254,10 +255,18 @@
let views = [];
for (let view of pose.views) {
let viewport = null;
+ let depthData = null;
if (session.isImmersive) {
- const depthData = xrGLFactory.getDepthInformation(view);
- if (depthData.isValid) {
+ depthData = xrGLFactory.getDepthInformation(view);
+ if (depthData) {
renderer.addExternalTexture('scene_depth', depthData.texture, true);
+
+ if ((depthData.depthNear !== session.renderState.depthNear) || (depthData.depthFar !== session.renderState.depthFar)) {
+ session.updateRenderState({
+ 'depthNear': depthData.depthNear,
+ 'depthFar': depthData.depthFar
+ });
+ }
}
glLayer = xrGLFactory.getViewSubImage(session.renderState.layers[0], view);
@@ -291,7 +300,7 @@
} else {
viewport = glLayer.getViewport(view);
}
- views.push(new WebXRView(view, glLayer, viewport));
+ views.push(new WebXRView(view, glLayer, viewport, depthData));
}
scene.drawViewArray(views);