未验证 提交 85f8bfe8 编写于 作者: M Mr.doob 提交者: GitHub

Merge pull request #16367 from fernandojsg/camera_bounds

Switch from camera "bounds" to "viewport"
......@@ -14,7 +14,7 @@
<p class="desc">
[name] can be used in order to efficiently render a scene with a predefined set of cameras. This is an important performance aspect for rendering VR scenes.<br />
An instance of [name] always has an array of sub cameras. It's mandatory to define for each sub camera the *bounds* property which determines the part of the viewport that is rendered with this camera.
An instance of [name] always has an array of sub cameras. It's mandatory to define for each sub camera the *viewport* property which determines the part of the viewport that is rendered with this camera.
</p>
<h2>Example</h2>
......
......@@ -15,7 +15,7 @@
<p class="desc">
[name] 用于更加高效地使用一组已经预定义的摄像机来渲染一个场景。这将能够更好地提升VR场景的渲染性能。<br />
一个 [name] 的实例中总是包含着一组子摄像机,应当为每一个子摄像机定义*bound*(边界)这个属性,这一属性决定了由该子摄像机所渲染的视口区域的大小。
一个 [name] 的实例中总是包含着一组子摄像机,应当为每一个子摄像机定义*viewport*(边界)这个属性,这一属性决定了由该子摄像机所渲染的视口区域的大小。
</p>
<h2>示例</h2>
......
......@@ -172,19 +172,9 @@ THREE.Reflector = function ( geometry, options ) {
// Restore viewport
var bounds = camera.bounds;
if ( camera.isArrayCamera ) {
if ( bounds !== undefined ) {
renderer.getSize( size );
var pixelRatio = renderer.getPixelRatio();
viewport.x = bounds.x * size.width * pixelRatio;
viewport.y = bounds.y * size.height * pixelRatio;
viewport.z = bounds.z * size.width * pixelRatio;
viewport.w = bounds.w * size.height * pixelRatio;
renderer.state.viewport( viewport );
renderer.state.viewport( camera.viewport );
}
......
......@@ -210,19 +210,9 @@ THREE.Refractor = function ( geometry, options ) {
// restore viewport
var bounds = camera.bounds;
if ( camera.isArrayCamera ) {
if ( bounds !== undefined ) {
renderer.getSize( size );
var pixelRatio = renderer.getPixelRatio();
viewport.x = bounds.x * size.width * pixelRatio;
viewport.y = bounds.y * size.height * pixelRatio;
viewport.z = bounds.z * size.width * pixelRatio;
viewport.w = bounds.w * size.height * pixelRatio;
renderer.state.viewport( viewport );
renderer.state.viewport( camera.viewport );
}
......
......@@ -1379,22 +1379,7 @@ function WebGLRenderer( parameters ) {
if ( object.layers.test( camera2.layers ) ) {
if ( 'viewport' in camera2 ) { // XR
state.viewport( _currentViewport.copy( camera2.viewport ) );
} else {
var bounds = camera2.bounds;
var x = bounds.x * _width;
var y = bounds.y * _height;
var width = bounds.z * _width;
var height = bounds.w * _height;
state.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );
}
state.viewport( _currentViewport.copy( camera2.viewport ) );
currentRenderState.setupLights( camera2 );
......
......@@ -15,6 +15,7 @@ import { setProjectionFromUnion } from './WebVRUtils.js';
function WebVRManager( renderer ) {
var renderWidth, renderHeight;
var scope = this;
var device = null;
......@@ -42,11 +43,11 @@ function WebVRManager( renderer ) {
var tempPosition = new Vector3();
var cameraL = new PerspectiveCamera();
cameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 );
cameraL.viewport = new Vector4();
cameraL.layers.enable( 1 );
var cameraR = new PerspectiveCamera();
cameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 );
cameraR.viewport = new Vector4();
cameraR.layers.enable( 2 );
var cameraVR = new ArrayCamera( [ cameraL, cameraR ] );
......@@ -68,14 +69,17 @@ function WebVRManager( renderer ) {
if ( isPresenting() ) {
var eyeParameters = device.getEyeParameters( 'left' );
var renderWidth = eyeParameters.renderWidth * framebufferScaleFactor;
var renderHeight = eyeParameters.renderHeight * framebufferScaleFactor;
renderWidth = eyeParameters.renderWidth * framebufferScaleFactor;
renderHeight = eyeParameters.renderHeight * framebufferScaleFactor;
currentPixelRatio = renderer.getPixelRatio();
renderer.getSize( currentSize );
renderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 );
cameraL.viewport.set( 0, 0, renderWidth, renderHeight );
cameraR.viewport.set( renderWidth, 0, renderWidth, renderHeight );
animation.start();
} else {
......@@ -176,6 +180,16 @@ function WebVRManager( renderer ) {
}
function updateViewportFromBounds( viewport, bounds ) {
if ( bounds !== null && bounds.length === 4 ) {
viewport.set( bounds[ 0 ] * renderWidth, bounds[ 1 ] * renderHeight, bounds[ 2 ] * renderWidth, bounds[ 3 ] * renderHeight );
}
}
//
this.enabled = false;
......@@ -343,17 +357,8 @@ function WebVRManager( renderer ) {
var layer = layers[ 0 ];
if ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {
cameraL.bounds.fromArray( layer.leftBounds );
}
if ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {
cameraR.bounds.fromArray( layer.rightBounds );
}
updateViewportFromBounds( cameraL.viewport, layer.leftBounds );
updateViewportFromBounds( cameraR.viewport, layer.rightBounds );
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册