Jelajahi Sumber

review feature detection, auto enable extensions in js

ncannasse 7 tahun lalu
induk
melakukan
3a8d137524
5 mengubah file dengan 44 tambahan dan 14 penghapusan
  1. 2 2
      h3d/impl/DirectXDriver.hx
  2. 4 0
      h3d/impl/Driver.hx
  3. 24 12
      h3d/impl/GlDriver.hx
  4. 7 0
      h3d/mat/PbrMaterialSetup.hx
  5. 7 0
      samples/Pbr.hx

+ 2 - 2
h3d/impl/DirectXDriver.hx

@@ -660,10 +660,10 @@ class DirectXDriver extends h3d.impl.Driver {
 
 	override function hasFeature(f:Feature) {
 		return switch(f) {
-		case StandardDerivatives, FloatTextures, AllocDepthBuffer, HardwareAccelerated, MultipleRenderTargets, SRGBTextures:
-			true;
 		case Queries:
 			false;
+		default:
+			true;
 		};
 	}
 

+ 4 - 0
h3d/impl/Driver.hx

@@ -87,6 +87,10 @@ enum Feature {
 		Supports gamma correct textures
 	*/
 	SRGBTextures;
+	/*
+		Allows advanced shader operations (webgl2, opengl3+, directx 9.0c+)
+	*/
+	ShaderModel3;
 }
 
 enum QueryKind {

+ 24 - 12
h3d/impl/GlDriver.hx

@@ -201,7 +201,10 @@ class GlDriver extends Driver {
 			shaderVersion = Math.round( Std.parseFloat(reg.matched(0)) * 100 );
 		}
 
-		#if !js
+		#if js
+		// make sure to enable extensions
+		makeFeatures();
+		#else
 		gl.enable(GL.TEXTURE_CUBE_MAP_SEAMLESS);
 		gl.pixelStorei(GL.PACK_ALIGNMENT, 1);
 		gl.pixelStorei(GL.UNPACK_ALIGNMENT, 1);
@@ -1210,17 +1213,31 @@ class GlDriver extends Driver {
 	}
 
 	override function hasFeature( f : Feature ) : Bool {
+		#if js
+		return features.get(f);
+		#else
+		return true;
+		#end
+	}
+
+	#if js
+	var features : Map<Feature,Bool> = new Map();
+	function makeFeatures() {
+		for( f in Type.allEnums(Feature) )
+			features.set(f,checkFeature(f));
+	}
+	function checkFeature( f : Feature ) {
 		return switch( f ) {
-		#if hl
 
-		case StandardDerivatives, FloatTextures, MultipleRenderTargets, Queries, SRGBTextures:
+		case HardwareAccelerated, AllocDepthBuffer:
 			true;
 
-		#else
-
 		case StandardDerivatives, MultipleRenderTargets, SRGBTextures if( glES >= 3 ):
 			true;
 
+		case ShaderModel3 if( glES >= 3 ):
+			true;
+
 		case FloatTextures if( glES >= 3 ):
 			gl.getExtension('EXT_color_buffer_float') != null && gl.getExtension("OES_texture_float_linear") != null; // allow render to 16f/32f textures (not standard in webgl 2)
 
@@ -1237,16 +1254,11 @@ class GlDriver extends Driver {
 		case MultipleRenderTargets:
 			mrtExt != null || (mrtExt = gl.getExtension('WEBGL_draw_buffers')) != null;
 
-		case Queries:
+		default:
 			false;
-
-		#end
-		case HardwareAccelerated:
-			true;
-		case AllocDepthBuffer:
-			true;
 		}
 	}
+	#end
 
 	override function captureRenderBuffer( pixels : hxd.Pixels ) {
 		if( curTarget == null )

+ 7 - 0
h3d/mat/PbrMaterialSetup.hx

@@ -42,6 +42,13 @@ class PbrMaterialSetup extends MaterialSetup {
 	}
 
 	override function createRenderer() : h3d.scene.Renderer {
+		#if js
+		// fallback to default renderer (prevent errors)
+		if( !h3d.Engine.getCurrent().driver.hasFeature(ShaderModel3) ) {
+			js.Browser.console.log("Could not initialize PBR Driver: WebGL2 required");
+			return super.createRenderer();
+		}
+		#end
 		var env = env;
 		if( env == null ) {
 			var envMap = new h3d.mat.Texture(4,4,[Cube]);

+ 7 - 0
samples/Pbr.hx

@@ -25,6 +25,13 @@ class Pbr extends SampleApp {
 		return;
 		#end
 
+		#if js
+		if( !engine.driver.hasFeature(ShaderModel3) ) {
+			new h2d.Text(getFont(), s2d).text = "WebGL 2.0 support required and not available on this browser.";
+			return;
+		}
+		#end
+
 		var sp = new h3d.prim.Sphere(1, 128, 128);
 		sp.addNormals();
 		sp.addUVs();