소스 검색

Added wireframe materials example (using lines, triangles and quads). Thanks to @jwagner and @pyalot

alteredq 13 년 전
부모
커밋
af92a42fb0
1개의 변경된 파일225개의 추가작업 그리고 0개의 파일을 삭제
  1. 225 0
      examples/webgl_materials_wireframe.html

+ 225 - 0
examples/webgl_materials_wireframe.html

@@ -0,0 +1,225 @@
+<!doctype html>
+<html lang="en">
+	<head>
+		<title>three.js webgl - materials - wireframe</title>
+		<meta charset="utf-8">
+		<style>
+			body {
+				margin: 0px;
+				background-color: #000000;
+				overflow: hidden;
+			}
+		</style>
+	</head>
+	<body>
+
+		<script src="../build/Three.js"></script>
+
+		<script type="x-shader/x-vertex" id="vertexShader">
+
+			attribute vec3 center;
+			varying vec3 vCenter;
+
+			void main() {
+
+				vCenter = center;
+				gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
+
+			}
+
+		</script>
+
+		<script type="x-shader/x-fragment" id="fragmentShaderQuad">
+
+			#extension GL_OES_standard_derivatives : enable
+
+			varying vec3 vCenter;
+
+			float edgeFactor1() {
+
+				vec2 d = fwidth( vCenter.xy );
+				vec2 a2 = smoothstep( vec2( 0.0 ), d * 1.5, vCenter.xy );
+				return min( a2.x, a2.y );
+
+			}
+
+			float edgeFactor2() {
+
+				vec2 d = fwidth( 1.0 - vCenter.xy );
+				vec2 a2 = smoothstep( vec2( 0.0 ), d * 1.5, 1.0 - vCenter.xy );
+
+				return min( a2.x, a2.y );
+			}
+
+
+			void main() {
+
+				gl_FragColor.rgb = mix( vec3( 1.0 ), vec3( 0.2 ), min( edgeFactor1(), edgeFactor2() ) );
+				gl_FragColor.a = 1.0;
+
+			}
+
+		</script>
+
+		<script type="x-shader/x-fragment" id="fragmentShaderTri">
+
+			#extension GL_OES_standard_derivatives : enable
+
+			varying vec3 vCenter;
+
+			float edgeFactor() {
+
+				vec3 d = fwidth( vCenter );
+				vec3 a3 = smoothstep( vec3( 0.0 ), d * 1.5, vCenter );
+				return min( min( a3.x, a3.y ), a3.z );
+
+			}
+
+			void main() {
+
+				gl_FragColor.rgb = mix( vec3( 1.0 ), vec3( 0.2 ), edgeFactor() );
+				gl_FragColor.a = 1.0;
+
+			}
+
+		</script>
+
+		<script>
+
+			var camera, scene, renderer;
+			var meshTris, meshQuads, meshLines;
+
+			init();
+			animate();
+
+			function init() {
+
+				scene = new THREE.Scene();
+
+				// camera
+
+				camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 2000 );
+				camera.position.z = 800;
+				scene.add( camera );
+
+				//
+
+				var size = 150;
+
+				var geometryLines = new THREE.CubeGeometry( size, size, size );
+				var geometryQuads = new THREE.CubeGeometry( size, size, size );
+				var geometryTris = new THREE.CubeGeometry( size, size, size );
+
+				THREE.GeometryUtils.triangulateQuads( geometryTris );
+
+				// wireframe using gl.LINES
+
+				var materialLines = new THREE.MeshBasicMaterial( { wireframe: true } );
+
+				meshLines = new THREE.Mesh( geometryLines, materialLines );
+				meshLines.position.x = 300;
+				scene.add( meshLines );
+
+				//
+
+				var vertexShader = document.getElementById( 'vertexShader' ).textContent;
+
+				var fragmentShaderQuad = document.getElementById( 'fragmentShaderQuad' ).textContent;
+				var fragmentShaderTri = document.getElementById( 'fragmentShaderTri' ).textContent;
+
+				// wireframe using gl.TRIANGLES (interpreted as quads)
+
+				var attributesQuads = { center: { type: 'v3', boundTo: 'faceVertices', value: [] } };
+				var valuesQuads = attributesQuads.center.value;
+
+				for( var f = 0; f < geometryQuads.faces.length; f ++ ) {
+
+					var face = geometryQuads.faces[ f ];
+
+					if ( face instanceof THREE.Face3 ) {
+
+						valuesQuads[ f ] = [ new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 1 ) ];
+
+					} else {
+
+						valuesQuads[ f ] = [ new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( 1, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 0 ) ];
+
+					}
+
+				}
+
+				var materialQuads = new THREE.ShaderMaterial( { uniforms: {}, attributes: attributesQuads, vertexShader: vertexShader, fragmentShader: fragmentShaderQuad } );
+
+				meshQuads = new THREE.Mesh( geometryQuads, materialQuads );
+				meshQuads.position.x = 0;
+				scene.add( meshQuads );
+
+				// wireframe using gl.TRIANGLES (interpreted as triangles)
+
+				var attributesTris = { center: { type: 'v3', boundTo: 'faceVertices', value: [] } };
+				var valuesTris = attributesTris.center.value;
+
+				for( var f = 0; f < geometryTris.faces.length; f ++ ) {
+
+					var face = geometryTris.faces[ f ];
+
+					if ( face instanceof THREE.Face3 ) {
+
+						valuesTris[ f ] = [ new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 1 ) ];
+
+					} else {
+
+						valuesQuads[ f ] = [ new THREE.Vector3( 1, 0, 0 ), new THREE.Vector3( 1, 1, 0 ), new THREE.Vector3( 0, 1, 0 ), new THREE.Vector3( 0, 0, 0 ) ];
+
+					}
+
+				}
+
+				var materialTris = new THREE.ShaderMaterial( { uniforms: {}, attributes: attributesTris, vertexShader: vertexShader, fragmentShader: fragmentShaderTri } );
+
+				meshTris = new THREE.Mesh( geometryTris, materialTris );
+				meshTris.position.x = -300;
+				scene.add( meshTris );
+
+				// renderer
+
+				renderer = new THREE.WebGLRenderer( { antialias: true } );
+				renderer.setSize( window.innerWidth, window.innerHeight );
+				document.body.appendChild( renderer.domElement );
+
+				// events
+
+				window.addEventListener( 'resize', onWindowResize, false );
+
+			}
+
+			function onWindowResize() {
+
+				camera.aspect = window.innerWidth / window.innerHeight;
+				camera.updateProjectionMatrix();
+
+				renderer.setSize( window.innerWidth, window.innerHeight );
+
+			}
+
+			function animate() {
+
+				requestAnimationFrame( animate );
+
+				meshLines.rotation.x += 0.005;
+				meshLines.rotation.y += 0.01;
+
+				meshQuads.rotation.x += 0.005;
+				meshQuads.rotation.y += 0.01;
+
+				meshTris.rotation.x += 0.005;
+				meshTris.rotation.y += 0.01;
+
+				renderer.render( scene, camera );
+
+			}
+
+		</script>
+
+	</body>
+</html>