Skip to content

Commit 037f2a9

Browse files
cabaniertoji
authored andcommitted
enhance multisample example for foveated textures
1 parent 119053c commit 037f2a9

File tree

2 files changed

+73
-12
lines changed

2 files changed

+73
-12
lines changed

js/webxr-sample-app.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,11 @@ export class WebXRSampleApp {
121121
return navigator.xr.requestSession(this.options.immersiveMode, {
122122
requiredFeatures: [this.options.referenceSpace]
123123
}).then((session) => {
124-
this.xrButton.setSession(session);
125-
session.isImmersive = true;
126-
this.onSessionStarted(session);
124+
this.gl.makeXRCompatible().then(() => {
125+
this.xrButton.setSession(session);
126+
session.isImmersive = true;
127+
this.onSessionStarted(session);
128+
});
127129
});
128130
}
129131

tests/webgl2-multisample.html

Lines changed: 68 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@
4141
Tests that applications that use WebGL 2.0 Multisampled Renderbuffers
4242
can succesfully blit the result to an XRWebGLLayer.
4343
<a class="back" href="./">Back</a>
44+
<br/>
45+
<input type="radio" id="useRenderbuffer" name="xrTarget" value="useRenderbuffer" checked>
46+
<label for="useRenderbuffer">use renderbuffers</label><br>
47+
<input type="radio" id="useTexture" value="useTexture" name="xrTarget">
48+
<label for="useTexture">use textures</label><br>
49+
<input type="radio" id="useMultisampleTexture" value="useMSTexture" name="xrTarget" disabled>
50+
<label for="useTexture">use textures with multisampling</label><br>
51+
<input type="radio" id="useFoveatedTexture" value="useFoveatedTexture" name="xrTarget" disabled>
52+
<label for="useFoveatedTexture">use foveated textures</label><br>
4453
</p>
4554
</details>
4655
</header>
@@ -59,8 +68,16 @@
5968
let polyfill = new WebXRPolyfill();
6069
}
6170

71+
let xrTargets = document.getElementsByName('xrTarget');
72+
6273
// WebXR sample app setup
6374
class CustomWebXRSampleApp extends WebXRSampleApp {
75+
getXRTarget() {
76+
for(let radio of xrTargets) {
77+
if(radio.checked) return radio.value;
78+
}
79+
}
80+
6481
onCreateGL() {
6582
const gl = createWebGLContext({
6683
webgl2: true,
@@ -74,6 +91,7 @@
7491
this.renderbufferWidth = 1024;
7592
this.renderbufferHeight = 1024;
7693
this.colorRenderbuffer = gl.createRenderbuffer();
94+
this.target = this.getXRTarget();
7795
gl.bindRenderbuffer(gl.RENDERBUFFER, this.colorRenderbuffer);
7896
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, this.renderbufferWidth, this.renderbufferHeight);
7997

@@ -85,6 +103,12 @@
85103
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this.colorRenderbuffer);
86104
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.depthRenderbuffer);
87105

106+
this.MRTR = gl.getExtension('WEBGL_multisampled_render_to_texture');
107+
if (this.MRTR !== null) {
108+
document.getElementById("useMultisampleTexture").disabled = false;
109+
document.getElementById("useFoveatedTexture").disabled = false;
110+
}
111+
88112
return gl;
89113
}
90114

@@ -103,22 +127,57 @@
103127
// Assumed to be a XRWebGLLayer for now.
104128
let layer = session.renderState.baseLayer;
105129

130+
// Rather than binding the layer's framebuffer like usual, bind a framebuffer using a
131+
// multisampled renderbuffer as the color attachment.
132+
gl.bindFramebuffer(gl.FRAMEBUFFER, this.multisampleFramebuffer);
133+
106134
// Check to see if we need to resize the renderbuffer
107135
if (layer.framebufferWidth != this.renderbufferWidth ||
108-
layer.framebufferHeight != this.renderbufferHeight) {
136+
layer.framebufferHeight != this.renderbufferHeight ||
137+
((this.target !== this.getXRTarget()) && session.isImmersive)) {
109138
this.renderbufferWidth = layer.framebufferWidth;
110139
this.renderbufferHeight = layer.framebufferHeight;
111140

112-
gl.bindRenderbuffer(gl.RENDERBUFFER, this.colorRenderbuffer);
113-
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, this.renderbufferWidth, this.renderbufferHeight);
141+
this.target = this.getXRTarget();
142+
if (this.target === "useRenderbuffer") {
143+
gl.bindRenderbuffer(gl.RENDERBUFFER, this.colorRenderbuffer);
144+
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.RGBA8, this.renderbufferWidth, this.renderbufferHeight);
114145

115-
gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthRenderbuffer);
116-
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.DEPTH_COMPONENT16, this.renderbufferWidth, this.renderbufferHeight);
117-
}
146+
gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthRenderbuffer);
147+
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.DEPTH_COMPONENT16, this.renderbufferWidth, this.renderbufferHeight);
118148

119-
// Rather than binding the layer's framebuffer like usual, bind a framebuffer using a
120-
// multisampled renderbuffer as the color attachment.
121-
gl.bindFramebuffer(gl.FRAMEBUFFER, this.multisampleFramebuffer);
149+
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, this.colorRenderbuffer);
150+
gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, this.depthRenderbuffer);
151+
} else {
152+
this.colorTexture = gl.createTexture();
153+
this.depthTexture = gl.createTexture();
154+
155+
gl.bindTexture(gl.TEXTURE_2D, this.colorTexture);
156+
157+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, this.renderbufferWidth, this.renderbufferHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
158+
159+
if (this.target === "useFoveatedTexture") {
160+
let xrGLFactory = new XRWebGLBinding(frame.session, gl);
161+
if (xrGLFactory.foveateBoundTexture) {
162+
xrGLFactory.foveateBoundTexture(gl.TEXTURE_2D, 1);
163+
}
164+
}
165+
166+
if (this.target === "useTexture") {
167+
gl.bindTexture(gl.TEXTURE_2D, this.depthTexture);
168+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT16, this.renderbufferWidth, this.renderbufferHeight, 0, gl.DEPTH_COMPONENT, gl.UNSIGNED_SHORT, null);
169+
170+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.colorTexture, 0);
171+
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.TEXTURE_2D, this.depthTexture, 0);
172+
} else {
173+
gl.bindRenderbuffer(gl.RENDERBUFFER, this.depthRenderbuffer);
174+
gl.renderbufferStorageMultisample(gl.RENDERBUFFER, 4, gl.DEPTH_COMPONENT16, this.renderbufferWidth, this.renderbufferHeight);
175+
176+
this.MRTR.framebufferTexture2DMultisampleEXT(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, this.colorTexture, 0, 4);
177+
}
178+
179+
}
180+
}
122181

123182
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
124183

0 commit comments

Comments
 (0)