瀏覽代碼

Merge pull request #20477 from bandicoot-imaging-sciences/rectarea-halffloat

RectAreaLight: Add half-float support.
Mr.doob 4 年之前
父節點
當前提交
3989bb4a00

文件差異過大導致無法顯示
+ 3 - 2
examples/js/lights/RectAreaLightUniformsLib.js


文件差異過大導致無法顯示
+ 4 - 2
examples/jsm/lights/RectAreaLightUniformsLib.js


+ 0 - 17
examples/webgl_lights_rectarealight.html

@@ -46,23 +46,6 @@
 				renderer.outputEncoding = THREE.sRGBEncoding;
 				document.body.appendChild( renderer.domElement );
 
-				// Check for float-RT support
-				// TODO (abelnation): figure out fall-back for float textures
-
-				if ( renderer.capabilities.isWebGL2 === false && ! renderer.extensions.get( 'OES_texture_float' ) ) {
-
-					alert( 'OES_texture_float not supported' );
-					throw 'missing webgl extension';
-
-				}
-
-				if ( renderer.capabilities.isWebGL2 === false && ! renderer.extensions.get( 'OES_texture_float_linear' ) ) {
-
-					alert( 'OES_texture_float_linear not supported' );
-					throw 'missing webgl extension';
-
-				}
-
 				camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 1, 1000 );
 				camera.position.set( 0, 20, 35 );
 

+ 1 - 1
src/renderers/WebGLRenderer.js

@@ -297,7 +297,7 @@ function WebGLRenderer( parameters ) {
 		programCache = new WebGLPrograms( _this, cubemaps, extensions, capabilities, bindingStates, clipping );
 		materials = new WebGLMaterials( properties );
 		renderLists = new WebGLRenderLists( properties );
-		renderStates = new WebGLRenderStates();
+		renderStates = new WebGLRenderStates( extensions, capabilities );
 		background = new WebGLBackground( _this, cubemaps, state, objects, _premultipliedAlpha );
 
 		bufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );

+ 4 - 1
src/renderers/webgl/WebGLLights.d.ts

@@ -1,6 +1,9 @@
+import { WebGLExtensions } from './WebGLExtensions';
+import { WebGLCapabilities } from './WebGLCapabilities';
+
 export class WebGLLights {
 
-	constructor( gl: WebGLRenderingContext, properties: any, info: any );
+	constructor( extensions: WebGLExtensions, capabilities: WebGLCapabilities );
 
 	state: {
 		version: number;

+ 29 - 3
src/renderers/webgl/WebGLLights.js

@@ -150,7 +150,7 @@ function shadowCastingLightsFirst( lightA, lightB ) {
 
 }
 
-function WebGLLights() {
+function WebGLLights( extensions, capabilities ) {
 
 	const cache = new UniformsCache();
 
@@ -407,8 +407,34 @@ function WebGLLights() {
 
 		if ( rectAreaLength > 0 ) {
 
-			state.rectAreaLTC1 = UniformsLib.LTC_1;
-			state.rectAreaLTC2 = UniformsLib.LTC_2;
+			if ( capabilities.isWebGL2 ) {
+
+				// WebGL 2
+
+				state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
+				state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
+
+			} else {
+
+				// WebGL 1
+
+				if ( extensions.has( 'OES_texture_float_linear' ) === true ) {
+
+					state.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;
+					state.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;
+
+				} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {
+
+					state.rectAreaLTC1 = UniformsLib.LTC_HALF_1;
+					state.rectAreaLTC2 = UniformsLib.LTC_HALF_2;
+
+				} else {
+
+					console.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );
+
+				}
+
+			}
 
 		}
 

+ 4 - 0
src/renderers/webgl/WebGLRenderStates.d.ts

@@ -2,6 +2,8 @@ import { Scene } from '../../scenes/Scene';
 import { Camera } from '../../cameras/Camera';
 import { Light } from '../../lights/Light';
 import { WebGLLights } from './WebGLLights';
+import { WebGLExtensions } from './WebGLExtensions';
+import { WebGLCapabilities } from './WebGLCapabilities';
 
 interface WebGLRenderState {
 
@@ -20,6 +22,8 @@ interface WebGLRenderState {
 
 export class WebGLRenderStates {
 
+	constructor( extensions: WebGLExtensions, capabilities: WebGLCapabilities );
+
 	get( scene: Scene, camera: Camera ): WebGLRenderState;
 	dispose(): void;
 

+ 5 - 5
src/renderers/webgl/WebGLRenderStates.js

@@ -1,8 +1,8 @@
 import { WebGLLights } from './WebGLLights.js';
 
-function WebGLRenderState() {
+function WebGLRenderState( extensions, capabilities ) {
 
-	const lights = new WebGLLights();
+	const lights = new WebGLLights( extensions, capabilities );
 
 	const lightsArray = [];
 	const shadowsArray = [];
@@ -50,7 +50,7 @@ function WebGLRenderState() {
 
 }
 
-function WebGLRenderStates() {
+function WebGLRenderStates( extensions, capabilities ) {
 
 	let renderStates = new WeakMap();
 
@@ -60,7 +60,7 @@ function WebGLRenderStates() {
 
 		if ( renderStates.has( scene ) === false ) {
 
-			renderState = new WebGLRenderState();
+			renderState = new WebGLRenderState( extensions, capabilities );
 			renderStates.set( scene, new WeakMap() );
 			renderStates.get( scene ).set( camera, renderState );
 
@@ -68,7 +68,7 @@ function WebGLRenderStates() {
 
 			if ( renderStates.get( scene ).has( camera ) === false ) {
 
-				renderState = new WebGLRenderState();
+				renderState = new WebGLRenderState( extensions, capabilities );
 				renderStates.get( scene ).set( camera, renderState );
 
 			} else {

部分文件因文件數量過多而無法顯示