提交 9598265d 编写于 作者: M Mr.doob

WebGLMultiview: Refactored extension availability code.

上级 42e89bc5
......@@ -1197,7 +1197,7 @@ function WebGLRenderer( parameters ) {
}
if ( capabilities.multiview ) {
if ( camera.isArrayCamera && multiview.isAvailable() ) {
multiview.attachCamera( camera );
......@@ -1257,7 +1257,7 @@ function WebGLRenderer( parameters ) {
state.setPolygonOffset( false );
if ( capabilities.multiview ) {
if ( camera.isArrayCamera && multiview.isAvailable() ) {
multiview.detachCamera( camera );
......@@ -1416,9 +1416,9 @@ function WebGLRenderer( parameters ) {
_currentArrayCamera = camera;
if ( capabilities.multiview ) {
if ( multiview.isAvailable() ) {
renderObject( object, scene, camera, geometry, material, group );
renderObject( object, scene, camera, geometry, material, group );
} else {
......
......@@ -86,10 +86,6 @@ function WebGLCapabilities( gl, extensions, parameters ) {
var maxSamples = isWebGL2 ? gl.getParameter( gl.MAX_SAMPLES ) : 0;
var multiviewExt = extensions.get( 'OVR_multiview2' );
var multiview = isWebGL2 && !! multiviewExt && ! gl.getContextAttributes().antialias;
var maxMultiviewViews = multiview ? gl.getParameter( multiviewExt.MAX_VIEWS_OVR ) : 0;
return {
isWebGL2: isWebGL2,
......@@ -114,10 +110,7 @@ function WebGLCapabilities( gl, extensions, parameters ) {
floatFragmentTextures: floatFragmentTextures,
floatVertexTextures: floatVertexTextures,
maxSamples: maxSamples,
multiview: multiview,
maxMultiviewViews: maxMultiviewViews
maxSamples: maxSamples
};
......
......@@ -13,28 +13,54 @@ function WebGLMultiview( renderer, gl ) {
var DEFAULT_NUMVIEWS = 2;
var capabilities = renderer.capabilities;
var extensions = renderer.extensions;
var properties = renderer.properties;
var maxNumViews = capabilities.maxMultiviewViews;
var renderTarget, currentRenderTarget;
var mat3, mat4, cameraArray, renderSize;
var mat3, mat4, renderSize;
function getCameraArray( camera ) {
var available;
var maxNumViews = 0;
if ( camera.isArrayCamera ) return camera.cameras;
//
cameraArray[ 0 ] = camera;
function isAvailable() {
return cameraArray;
if ( available === undefined ) {
}
var extension = extensions.get( 'OVR_multiview2' );
//
available = extension !== null && gl.getContextAttributes().antialias === false;
if ( available ) {
maxNumViews = gl.getParameter( extension.MAX_VIEWS_OVR );
renderTarget = new WebGLMultiviewRenderTarget( 0, 0, DEFAULT_NUMVIEWS );
renderSize = new Vector2();
mat4 = [];
mat3 = [];
var maxViews = capabilities.maxMultiviewViews;
for ( var i = 0; i < maxViews; i ++ ) {
mat4[ i ] = new Matrix4();
mat3[ i ] = new Matrix3();
}
}
}
return available;
}
function updateCameraProjectionMatricesUniform( camera, uniforms ) {
var cameras = getCameraArray( camera );
var cameras = camera.cameras;
for ( var i = 0; i < cameras.length; i ++ ) {
......@@ -48,7 +74,7 @@ function WebGLMultiview( renderer, gl ) {
function updateCameraViewMatricesUniform( camera, uniforms ) {
var cameras = getCameraArray( camera );
var cameras = camera.cameras;
for ( var i = 0; i < cameras.length; i ++ ) {
......@@ -62,7 +88,7 @@ function WebGLMultiview( renderer, gl ) {
function updateObjectMatricesUniforms( object, camera, uniforms ) {
var cameras = getCameraArray( camera );
var cameras = camera.cameras;
for ( var i = 0; i < cameras.length; i ++ ) {
......@@ -78,8 +104,6 @@ function WebGLMultiview( renderer, gl ) {
function isMultiviewCompatible( camera ) {
if ( ! camera.isArrayCamera ) return true;
var cameras = camera.cameras;
if ( cameras.length > maxNumViews ) return false;
......@@ -107,20 +131,10 @@ function WebGLMultiview( renderer, gl ) {
}
if ( camera.isArrayCamera ) {
var viewport = camera.cameras[ 0 ].viewport;
renderTarget.setSize( viewport.z, viewport.w );
var viewport = camera.cameras[ 0 ].viewport;
renderTarget.setNumViews( camera.cameras.length );
} else {
renderTarget.setSize( renderSize.x, renderSize.y );
renderTarget.setNumViews( DEFAULT_NUMVIEWS );
}
renderTarget.setSize( viewport.z, viewport.w );
renderTarget.setNumViews( camera.cameras.length );
}
......@@ -139,6 +153,7 @@ function WebGLMultiview( renderer, gl ) {
if ( renderTarget !== renderer.getRenderTarget() ) return;
renderer.setRenderTarget( currentRenderTarget );
flush( camera );
}
......@@ -153,53 +168,23 @@ function WebGLMultiview( renderer, gl ) {
var viewWidth = srcRenderTarget.width;
var viewHeight = srcRenderTarget.height;
if ( camera.isArrayCamera ) {
for ( var i = 0; i < numViews; i ++ ) {
var viewport = camera.cameras[ i ].viewport;
var x1 = viewport.x;
var y1 = viewport.y;
var x2 = x1 + viewport.z;
var y2 = y1 + viewport.w;
gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ i ] );
gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, x1, y1, x2, y2, gl.COLOR_BUFFER_BIT, gl.NEAREST );
}
} else {
gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ 0 ] );
gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, 0, 0, renderSize.x, renderSize.y, gl.COLOR_BUFFER_BIT, gl.NEAREST );
}
}
if ( renderer.capabilities.multiview ) {
for ( var i = 0; i < numViews; i ++ ) {
renderTarget = new WebGLMultiviewRenderTarget( 0, 0, DEFAULT_NUMVIEWS );
var viewport = camera.cameras[ i ].viewport;
renderSize = new Vector2();
mat4 = [];
mat3 = [];
cameraArray = [];
var x1 = viewport.x;
var y1 = viewport.y;
var x2 = x1 + viewport.z;
var y2 = y1 + viewport.w;
var maxViews = capabilities.maxMultiviewViews;
for ( var i = 0; i < maxViews; i ++ ) {
mat4[ i ] = new Matrix4();
mat3[ i ] = new Matrix3();
gl.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffers[ i ] );
gl.blitFramebuffer( 0, 0, viewWidth, viewHeight, x1, y1, x2, y2, gl.COLOR_BUFFER_BIT, gl.NEAREST );
}
}
this.isAvailable = isAvailable;
this.attachCamera = attachCamera;
this.detachCamera = detachCamera;
this.updateCameraProjectionMatricesUniform = updateCameraProjectionMatricesUniform;
......
......@@ -1016,53 +1016,45 @@ function WebGLTextures( _gl, extensions, state, properties, capabilities, utils,
} else if ( isMultiview ) {
if ( capabilities.multiview ) {
var width = renderTarget.width;
var height = renderTarget.height;
var numViews = renderTarget.numViews;
_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
var ext = extensions.get( 'OVR_multiview2' );
info.memory.textures += 2;
var width = renderTarget.width;
var height = renderTarget.height;
var numViews = renderTarget.numViews;
var colorTexture = _gl.createTexture();
_gl.bindTexture( _gl.TEXTURE_2D_ARRAY, colorTexture );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
_gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.RGBA8, width, height, numViews, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null );
ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, 0, numViews );
_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );
var depthStencilTexture = _gl.createTexture();
_gl.bindTexture( _gl.TEXTURE_2D_ARRAY, depthStencilTexture );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
_gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.DEPTH24_STENCIL8, width, height, numViews, 0, _gl.DEPTH_STENCIL, _gl.UNSIGNED_INT_24_8, null );
ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, depthStencilTexture, 0, 0, numViews );
var ext = extensions.get( 'OVR_multiview2' );
var viewFramebuffers = new Array( numViews );
for ( var i = 0; i < numViews; ++ i ) {
info.memory.textures += 2;
viewFramebuffers[ i ] = _gl.createFramebuffer();
_gl.bindFramebuffer( _gl.FRAMEBUFFER, viewFramebuffers[ i ] );
_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, i );
var colorTexture = _gl.createTexture();
_gl.bindTexture( _gl.TEXTURE_2D_ARRAY, colorTexture );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
_gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.RGBA8, width, height, numViews, 0, _gl.RGBA, _gl.UNSIGNED_BYTE, null );
ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, 0, numViews );
}
var depthStencilTexture = _gl.createTexture();
_gl.bindTexture( _gl.TEXTURE_2D_ARRAY, depthStencilTexture );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MAG_FILTER, _gl.NEAREST );
_gl.texParameteri( _gl.TEXTURE_2D_ARRAY, _gl.TEXTURE_MIN_FILTER, _gl.NEAREST );
_gl.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, _gl.DEPTH24_STENCIL8, width, height, numViews, 0, _gl.DEPTH_STENCIL, _gl.UNSIGNED_INT_24_8, null );
ext.framebufferTextureMultiviewOVR( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, depthStencilTexture, 0, 0, numViews );
renderTargetProperties.__webglColorTexture = colorTexture;
renderTargetProperties.__webglDepthStencilTexture = depthStencilTexture;
renderTargetProperties.__webglViewFramebuffers = viewFramebuffers;
var viewFramebuffers = new Array( numViews );
for ( var i = 0; i < numViews; ++ i ) {
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
_gl.bindTexture( _gl.TEXTURE_2D_ARRAY, null );
viewFramebuffers[ i ] = _gl.createFramebuffer();
_gl.bindFramebuffer( _gl.FRAMEBUFFER, viewFramebuffers[ i ] );
_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, colorTexture, 0, i );
} else {
}
console.warn( 'THREE.WebGLRenderer: WebGLMultiviewRenderTarget can only be used with WebGL2 and Multiview extension support.' );
renderTargetProperties.__webglColorTexture = colorTexture;
renderTargetProperties.__webglDepthStencilTexture = depthStencilTexture;
renderTargetProperties.__webglViewFramebuffers = viewFramebuffers;
}
_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );
_gl.bindTexture( _gl.TEXTURE_2D_ARRAY, null );
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册