Sfoglia il codice sorgente

added render to cube texture support, reuse single gl framebuffer

ncannasse 8 anni fa
parent
commit
0bebcee763
5 ha cambiato i file con 33 aggiunte e 52 eliminazioni
  1. 5 5
      h3d/impl/Driver.hx
  2. 23 27
      h3d/impl/GlDriver.hx
  3. 3 3
      h3d/impl/LogDriver.hx
  4. 2 2
      h3d/impl/Stage3dDriver.hx
  5. 0 15
      hxd/App.hx

+ 5 - 5
h3d/impl/Driver.hx

@@ -7,19 +7,19 @@ typedef Texture = flash.display3D.textures.TextureBase;
 #elseif js
 typedef IndexBuffer = js.html.webgl.Buffer;
 typedef VertexBuffer = { b : js.html.webgl.Buffer, stride : Int };
-typedef Texture = { t : js.html.webgl.Texture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?fb : js.html.webgl.Framebuffer, ?rb : js.html.webgl.Renderbuffer };
+typedef Texture = { t : js.html.webgl.Texture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?rb : js.html.webgl.Renderbuffer };
 #elseif nme
 typedef IndexBuffer = nme.gl.GLBuffer;
 typedef VertexBuffer = { b : nme.gl.GLBuffer, stride : Int };
-typedef Texture = { t : nme.gl.GLTexture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?fb : nme.gl.GLFramebuffer, ?rb : nme.gl.GLRenderbuffer };
+typedef Texture = { t : nme.gl.GLTexture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?rb : nme.gl.GLRenderbuffer };
 #elseif lime
 typedef IndexBuffer = lime.graphics.opengl.GLBuffer;
 typedef VertexBuffer = { b : lime.graphics.opengl.GLBuffer, stride : Int };
-typedef Texture = { t : lime.graphics.opengl.GLTexture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?fb : lime.graphics.opengl.GLFramebuffer, ?rb : lime.graphics.opengl.GLRenderbuffer };
+typedef Texture = { t : lime.graphics.opengl.GLTexture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?rb : lime.graphics.opengl.GLRenderbuffer };
 #elseif hxsdl
 typedef IndexBuffer = sdl.GL.Buffer;
 typedef VertexBuffer = { b : sdl.GL.Buffer, stride : Int };
-typedef Texture = { t : sdl.GL.Texture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?fb : sdl.GL.Framebuffer, ?rb : sdl.GL.Renderbuffer };
+typedef Texture = { t : sdl.GL.Texture, width : Int, height : Int, internalFmt : Int, pixelFmt : Int, ?rb : sdl.GL.Renderbuffer };
 #else
 typedef IndexBuffer = {};
 typedef VertexBuffer = {};
@@ -134,7 +134,7 @@ class Driver {
 	public function setRenderZone( x : Int, y : Int, width : Int, height : Int ) {
 	}
 
-	public function setRenderTarget( tex : Null<h3d.mat.Texture> ) {
+	public function setRenderTarget( tex : Null<h3d.mat.Texture>, face = 0 ) {
 	}
 
 	public function setRenderTargets( textures : Array<h3d.mat.Texture> ) {

+ 23 - 27
h3d/impl/GlDriver.hx

@@ -12,11 +12,13 @@ private typedef GL = js.html.webgl.GL;
 private typedef Uniform = js.html.webgl.UniformLocation;
 private typedef Program = js.html.webgl.Program;
 private typedef GLShader = js.html.webgl.Shader;
+private typedef Framebuffer = js.html.webgl.Framebuffer;
 #elseif lime
 import lime.graphics.opengl.GL;
 private typedef Uniform = Dynamic;
 private typedef Program = lime.graphics.opengl.GLProgram;
 private typedef GLShader = lime.graphics.opengl.GLShader;
+private typedef Framebuffer = lime.graphics.opengl.Framebuffer;
 private typedef Uint16Array = lime.utils.UInt16Array;
 private typedef Uint8Array = lime.utils.UInt8Array;
 private typedef Float32Array = lime.utils.Float32Array;
@@ -25,6 +27,7 @@ import nme.gl.GL;
 private typedef Uniform = Dynamic;
 private typedef Program = nme.gl.GLProgram;
 private typedef GLShader = nme.gl.GLShader;
+private typedef Framebuffer = nme.gl.Framebuffer;
 private typedef Uint16Array = nme.utils.Int16Array;
 private typedef Uint8Array = nme.utils.UInt8Array;
 private typedef Float32Array = nme.utils.Float32Array;
@@ -33,6 +36,7 @@ import sdl.GL;
 private typedef Uniform = sdl.GL.Uniform;
 private typedef Program = sdl.GL.Program;
 private typedef GLShader = sdl.GL.Shader;
+private typedef Framebuffer = sdl.GL.Framebuffer;
 private typedef Texture = h3d.impl.Driver.Texture;
 #if cpp
 private typedef Float32Array = Array<cpp.Float32>;
@@ -77,6 +81,7 @@ class GlDriver extends Driver {
 	public var gl : js.html.webgl.RenderingContext;
 	#end
 
+	var commonFB : Framebuffer;
 	var curAttribs : Int;
 	var curShader : CompiledProgram;
 	var curBuffer : h3d.Buffer;
@@ -98,6 +103,7 @@ class GlDriver extends Driver {
 		// debug if webgl_debug.js is included
 		untyped if( __js__('typeof')(WebGLDebugUtils) != "undefined" ) gl = untyped WebGLDebugUtils.makeDebugContext(gl);
 		#end
+		commonFB = gl.createFramebuffer();
 		programs = new Map();
 		curAttribs = 0;
 		curMatBits = -1;
@@ -439,19 +445,11 @@ class GlDriver extends Driver {
 				gl.texImage2D(CUBE_FACES[i], 0, tt.internalFmt, tt.width, tt.height, 0, getChannels(tt), tt.pixelFmt, null);
 		} else
 			gl.texImage2D(bind, 0, tt.internalFmt, tt.width, tt.height, 0, getChannels(tt), tt.pixelFmt, null);
-		if( t.flags.has(Target) ) {
-			var fb = gl.createFramebuffer();
-			gl.bindFramebuffer(GL.FRAMEBUFFER, fb);
-			gl.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, GL.TEXTURE_2D, tt.t, 0);
-			tt.fb = fb;
-			if( t.flags.has(TargetDepth) ) {
-				tt.rb = gl.createRenderbuffer();
-				gl.bindRenderbuffer(GL.RENDERBUFFER, tt.rb);
-				gl.renderbufferStorage(GL.RENDERBUFFER, GL.DEPTH_COMPONENT16, tt.width, tt.height);
-				gl.framebufferRenderbuffer(GL.FRAMEBUFFER, GL.DEPTH_ATTACHMENT, GL.RENDERBUFFER, tt.rb);
-				gl.bindRenderbuffer(GL.RENDERBUFFER, null);
-			}
-			gl.bindFramebuffer(GL.FRAMEBUFFER, curTarget == null || curTarget.t == null ? null : curTarget.t.fb);
+		if( t.flags.has(TargetDepth) ) {
+			tt.rb = gl.createRenderbuffer();
+			gl.bindRenderbuffer(GL.RENDERBUFFER, tt.rb);
+			gl.renderbufferStorage(GL.RENDERBUFFER, GL.DEPTH_COMPONENT16, tt.width, tt.height);
+			gl.bindRenderbuffer(GL.RENDERBUFFER, null);
 		}
 		gl.bindTexture(bind, null);
 		return tt;
@@ -494,7 +492,6 @@ class GlDriver extends Driver {
 		t.t = null;
 		gl.deleteTexture(tt.t);
 		if( tt.rb != null ) gl.deleteRenderbuffer(tt.rb);
-		if( tt.fb != null ) gl.deleteFramebuffer(tt.fb);
 	}
 
 	override function disposeIndexes( i : IndexBuffer ) {
@@ -756,7 +753,7 @@ class GlDriver extends Driver {
 		}
 	}
 
-	override function setRenderTarget( tex : h3d.mat.Texture ) {
+	override function setRenderTarget( tex : h3d.mat.Texture, face = 0 ) {
 		unbindTargets();
 		curTarget = tex;
 		if( tex == null ) {
@@ -767,27 +764,26 @@ class GlDriver extends Driver {
 		if( tex.t == null )
 			tex.alloc();
 		tex.lastFrame = frame;
-		gl.bindFramebuffer(GL.FRAMEBUFFER, tex.t.fb);
+		gl.bindFramebuffer(GL.FRAMEBUFFER, commonFB);
+		gl.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0, tex.flags.has(Cubic) ? CUBE_FACES[face] : GL.TEXTURE_2D, tex.t.t, 0);
+		if( tex.t.rb != null )
+			gl.framebufferRenderbuffer(GL.FRAMEBUFFER, GL.DEPTH_ATTACHMENT, GL.RENDERBUFFER, tex.t.rb);
+		else
+			gl.framebufferRenderbuffer(GL.FRAMEBUFFER, GL.DEPTH_ATTACHMENT, GL.RENDERBUFFER, null);
 		gl.viewport(0, 0, tex.width, tex.height);
 	}
 
 	override function setRenderTargets( textures : Array<h3d.mat.Texture> ) {
 		unbindTargets();
-		if( textures.length < 2 ) {
-			setRenderTarget(textures[0]);
+		setRenderTarget(textures[0]);
+		if( textures.length < 2 )
 			return;
-		}
-		curTarget = textures[0];
 		numTargets = textures.length;
-		for( tex in textures ) {
+		for( i in 1...textures.length ) {
+			var tex = textures[i];
 			if( tex.t == null )
 				tex.alloc();
-			if( tex == curTarget ) {
-				gl.bindFramebuffer(GL.FRAMEBUFFER, curTarget.t.fb);
-				gl.viewport(0, 0, tex.width, tex.height);
-			} else {
-				gl.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0 + textures.indexOf(tex), GL.TEXTURE_2D, tex.t.t, 0);
-			}
+			gl.framebufferTexture2D(GL.FRAMEBUFFER, GL.COLOR_ATTACHMENT0 + i, GL.TEXTURE_2D, tex.t.t, 0);
 			tex.lastFrame = frame;
 		}
 		#if js

+ 3 - 3
h3d/impl/LogDriver.hx

@@ -274,9 +274,9 @@ class LogDriver extends Driver {
 		d.setRenderZone(x, y, width, height);
 	}
 
-	override function setRenderTarget( tex : Null<h3d.mat.Texture> ) {
-		log('SetRenderTarget $tex');
-		d.setRenderTarget(tex);
+	override function setRenderTarget( tex : Null<h3d.mat.Texture>, face = 0 ) {
+		log('SetRenderTarget $tex $face');
+		d.setRenderTarget(tex, face);
 	}
 
 	override function setRenderTargets( textures : Array<h3d.mat.Texture> ) {

+ 2 - 2
h3d/impl/Stage3dDriver.hx

@@ -761,7 +761,7 @@ class Stage3dDriver extends Driver {
 		}
 	}
 
-	override function setRenderTarget( t : Null<h3d.mat.Texture>) {
+	override function setRenderTarget( t : Null<h3d.mat.Texture>, face = 0 ) {
 		if( renderTargets > 1 ) {
 			for( i in 1...renderTargets )
 				ctx.setRenderToTexture(null, false, 0, 0, i);
@@ -773,7 +773,7 @@ class Stage3dDriver extends Driver {
 		} else {
 			if( t.t == null )
 				t.alloc();
-			ctx.setRenderToTexture(t.t, t.flags.has(TargetUseDefaultDepth));
+			ctx.setRenderToTexture(t.t, t.flags.has(TargetUseDefaultDepth), 0, face);
 			renderTargets = 1;
 			t.lastFrame = frame;
 			// make sure we at least clear the color the first time

+ 0 - 15
hxd/App.hx

@@ -90,21 +90,6 @@ class App {
 			driver.logEnable = old;
 			engine.setDriver(driver);
 			hxd.File.saveBytes("log.txt", haxe.io.Bytes.ofString(log.logLines.join("\n")));
-		} else {
-			var scnDriver = Std.instance(engine.driver, h3d.impl.ScnDriver);
-			if( hxd.Key.isDown(hxd.Key.CTRL) && hxd.Key.isDown(hxd.Key.F11) ) {
-				if( scnDriver == null ) {
-					engine.setDriver(new h3d.impl.ScnDriver(engine.driver));
-					engine.mem.onContextLost();
-					engine.onContextLost();
-					engine.resize(engine.width, engine.height);
-					engine.render(s3d); // first render to perform allocations
-				}
-			} else if( scnDriver != null ) {
-				engine.setDriver(scnDriver.getDriver());
-				hxd.File.saveBytes("record.scn", scnDriver.getBytes());
-			}
-			engine.render(s3d);
 		}
 		#else
 			engine.render(s3d);