Bläddra i källkod

Added scene override material to RenderPass. Added mipmapped depth-of-field shader.

alteredq 14 år sedan
förälder
incheckning
0bd23ca973
2 ändrade filer med 63 tillägg och 1 borttagningar
  1. 57 0
      examples/js/ShaderExtras.js
  2. 6 1
      examples/js/postprocessing/RenderPass.js

+ 57 - 0
examples/js/ShaderExtras.js

@@ -343,6 +343,63 @@ THREE.ShaderExtras = {
 
 	},
 
+	/* -------------------------------------------------------------------------
+	//	Depth-of-field shader using mipmaps
+	//	- from Matt Handley @applmak
+	//	- requires power-of-2 sized render target with enabled mipmaps
+	 ------------------------------------------------------------------------- */
+
+	'dofmipmap': {
+
+		uniforms: {
+
+			tColor:   { type: "t", value: 0, texture: null },
+			tDepth:   { type: "t", value: 1, texture: null },
+			focus:    { type: "f", value: 1.0 },
+			maxblur:  { type: "f", value: 1.0 }
+
+		},
+
+		vertexShader: [
+
+			"varying vec2 vUv;",
+
+			"void main() {",
+
+				"vUv = vec2( uv.x, 1.0 - uv.y );",
+				"gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );",
+
+			"}"
+
+		].join("\n"),
+
+		fragmentShader: [
+
+			"uniform float focus;",
+			"uniform float maxblur;",
+
+			"uniform sampler2D tColor;",
+			"uniform sampler2D tDepth;",
+
+			"varying vec2 vUv;",
+
+			"void main() {",
+
+				"vec4 depth = texture2D( tDepth, vUv );",
+
+				"float factor = depth.x - focus;",
+
+				"vec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );",
+
+				"gl_FragColor = col;",
+				"gl_FragColor.a = 1.0;",
+
+			"}"
+
+		].join("\n")
+
+	},
+
 	/* -------------------------------------------------------------------------
 	//	Sepia tone shader
 	//  - based on glfx.js sepia shader

+ 6 - 1
examples/js/postprocessing/RenderPass.js

@@ -2,10 +2,11 @@
  * @author alteredq / http://alteredqualia.com/
  */
 
-THREE.RenderPass = function ( scene, camera ) {
+THREE.RenderPass = function ( scene, camera, overrideMaterial ) {
 
 	this.scene = scene;
 	this.camera = camera;
+	this.overrideMaterial = overrideMaterial;
 
 	this.clear = true;
 	this.needsSwap = false;
@@ -16,8 +17,12 @@ THREE.RenderPass.prototype = {
 
 	render: function ( renderer, writeBuffer, readBuffer, delta ) {
 
+		this.scene.overrideMaterial = this.overrideMaterial;
+
 		renderer.render( this.scene, this.camera, readBuffer, this.clear );
 
+		this.scene.overrideMaterial = null;
+
 	}
 
 };