浏览代码

Add performance viewer mode.

clementlandrin 2 年之前
父节点
当前提交
cf08a0bb49
共有 2 个文件被更改,包括 54 次插入1 次删除
  1. 40 1
      h3d/scene/pbr/Renderer.hx
  2. 14 0
      h3d/shader/pbr/PerformanceViewer.hx

+ 40 - 1
h3d/scene/pbr/Renderer.hx

@@ -17,6 +17,7 @@ package h3d.scene.pbr;
 		Debug slides
 	*/
 	var Debug = "Debug";
+	var Performance = "Performance";
 }
 
 @:enum abstract SkyMode(String) {
@@ -66,6 +67,7 @@ class Renderer extends h3d.scene.Renderer {
 	var pbrProps = new h3d.shader.pbr.PropsImport();
 	var enableFXAA = true;
 	var currentStep : h3d.impl.RendererFX.Step;
+	var performance = new h3d.pass.ScreenFx(new h3d.shader.pbr.PerformanceViewer());
 
 	var textures = {
 		albedo : (null:h3d.mat.Texture),
@@ -235,6 +237,26 @@ class Renderer extends h3d.scene.Renderer {
 		}
 
 		begin(Lighting);
+		if ( displayMode == Performance ) {
+			var content;
+			try {
+				content = hxd.res.Loader.currentInstance.load("props.json").toText();
+			} catch ( e : Dynamic ) {
+				throw "Missing props.json";
+			}
+			var obj = try haxe.Json.parse(content) catch( e : Dynamic ) throw "Failed to parse props.json";
+			var ls = hxd.impl.Api.downcast(getLightSystem(), h3d.scene.pbr.LightSystem);
+			var s = new h3d.shader.pbr.Light.Performance();
+
+			s.maxLights = Std.parseInt(Reflect.field(obj, "performance.maxLights"));
+			var gradient = Reflect.field(obj, "performance.lightGradient");
+			try {
+				performance.shader.gradient = hxd.res.Loader.currentInstance.load(gradient).toTexture();
+			} catch ( e : Dynamic ) {
+				throw "Missing performance.lightGradient in props.json";
+			}
+			ls.lightingShaders.push(s);
+		}
 		var lpass = screenLightPass;
 		if( lpass == null ) {
 			lpass = new h3d.pass.ScreenFx(new h3d.shader.ScreenShader());
@@ -256,6 +278,11 @@ class Renderer extends h3d.scene.Renderer {
 		pbrProps.isScreen = false;
 		draw(pbrLightPass.name);
 
+		if ( displayMode == Performance ) {
+			end();
+			return;
+		}
+
 		mark("Indirect Lighting");
 		if( !renderLightProbes() && env != null && env.power > 0.0 ) {
 			pbrProps.isScreen = true;
@@ -387,7 +414,9 @@ class Renderer extends h3d.scene.Renderer {
 
 	function beginPbr() {
 		var props : RenderProps = props;
-
+		if ( displayMode == Performance ) {
+			performance.shader.gradient = hrt.impl.TextureType.Utils.getTextureFromValue(props.performanceGradient);
+		}
 		// reset tonemap shaders
 		var s = @:privateAccess tonemap.pass.shaders;
 		while( s != null ) {
@@ -630,6 +659,15 @@ class Renderer extends h3d.scene.Renderer {
 				hxd.Window.getInstance().addEventTarget(onEvent);
 			}
 			#if editor
+			renderPass(defaultPass, get("overlay"), backToFront);
+			renderPass(defaultPass, get("ui"), backToFront);
+			#end
+		case Performance:
+			var hdr = ctx.getGlobal("hdrMap");
+			performance.shader.hdrMap = hdr;
+			performance.render();
+			#if editor
+			renderPass(defaultPass, get("overlay"), backToFront);
 			renderPass(defaultPass, get("ui"), backToFront);
 			#end
 		}
@@ -705,6 +743,7 @@ class Renderer extends h3d.scene.Renderer {
 						<option value="MatCap">MatCap</option>
 						<option value="Debug">Debug</option>
 						<option value="Distortion">Distortion</option>
+						<option value="Performance">Performance</option>
 					</select>
 				</dd>
 

+ 14 - 0
h3d/shader/pbr/PerformanceViewer.hx

@@ -0,0 +1,14 @@
+package h3d.shader.pbr;
+
+class PerformanceViewer extends ScreenShader {
+
+	static var SRC = {
+
+		@param var hdrMap : Sampler2D;
+		@param var gradient : Sampler2D;
+
+		function fragment() {
+			pixelColor = gradient.get(vec2(hdrMap.get(calculatedUV).saturate().r, 0.0));
+		}
+	};
+}