|
19 | 19 | void main() { |
20 | 20 |
|
21 | 21 | vCenter = center; |
| 22 | + |
22 | 23 | gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 ); |
23 | 24 |
|
24 | 25 | } |
|
27 | 28 |
|
28 | 29 | <script type="x-shader/x-fragment" id="fragmentShader"> |
29 | 30 |
|
| 31 | + uniform float widthFactor; |
| 32 | + |
30 | 33 | varying vec3 vCenter; |
31 | 34 |
|
32 | 35 | float edgeFactorTri() { |
33 | 36 |
|
34 | 37 | vec3 d = fwidth( vCenter.xyz ); |
35 | | - vec3 a3 = smoothstep( vec3( 0.0 ), d * 1.5, vCenter.xyz ); |
| 38 | + |
| 39 | + vec3 a3 = smoothstep( vec3( 0.0 ), d * widthFactor, vCenter.xyz ); |
| 40 | + |
36 | 41 | return min( min( a3.x, a3.y ), a3.z ); |
37 | 42 |
|
38 | 43 | } |
39 | 44 |
|
40 | 45 | void main() { |
41 | 46 |
|
42 | | - gl_FragColor.rgb = mix( vec3( 1.0 ), vec3( 0.2 ), edgeFactorTri() ); |
43 | | - gl_FragColor.a = 1.0; |
| 47 | + if ( edgeFactorTri() > 0.99 ) discard; |
| 48 | + |
| 49 | + gl_FragColor = gl_FrontFacing ? vec4( 0.9, 0.9, 1.0, 1.0 ) : vec4( 0.4, 0.4, 0.5, 1.0 ); |
| 50 | + |
44 | 51 | } |
45 | 52 |
|
46 | 53 | </script> |
|
49 | 56 |
|
50 | 57 | import * as THREE from '../build/three.module.js'; |
51 | 58 |
|
52 | | - var camera, scene, renderer; |
| 59 | + import { GUI } from './jsm/libs/dat.gui.module.js'; |
| 60 | + |
| 61 | + var API = { |
| 62 | + widthFactor: 1 |
| 63 | + }; |
| 64 | + |
| 65 | + var renderer, scene, camera, mesh1, mesh2; |
53 | 66 |
|
54 | 67 | init(); |
55 | | - animate(); |
56 | 68 |
|
57 | 69 | function init() { |
58 | 70 |
|
59 | | - var geometry, material, mesh; |
| 71 | + renderer = new THREE.WebGLRenderer( { antialias: true } ); |
| 72 | + renderer.setPixelRatio( window.devicePixelRatio ); |
| 73 | + renderer.setSize( window.innerWidth, window.innerHeight ); |
| 74 | + document.body.appendChild( renderer.domElement ); |
60 | 75 |
|
61 | | - var size = 150; |
| 76 | + scene = new THREE.Scene(); |
62 | 77 |
|
63 | | - camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 2000 ); |
64 | | - camera.position.z = 800; |
| 78 | + camera = new THREE.PerspectiveCamera( 40, window.innerWidth / window.innerHeight, 1, 500 ); |
| 79 | + camera.position.z = 150; |
65 | 80 |
|
66 | | - scene = new THREE.Scene(); |
| 81 | + new THREE.BufferGeometryLoader().load( 'models/json/WaltHeadLo_buffergeometry.json', function ( geometry ) { |
67 | 82 |
|
68 | | - // |
| 83 | + // on the left |
69 | 84 |
|
70 | | - geometry = new THREE.BoxBufferGeometry( size, size, size ); |
71 | | - material = new THREE.MeshBasicMaterial( { wireframe: true } ); |
| 85 | + var material = new THREE.MeshBasicMaterial( { |
72 | 86 |
|
73 | | - mesh = new THREE.Mesh( geometry, material ); |
74 | | - mesh.position.x = - 150; |
75 | | - scene.add( mesh ); |
| 87 | + color: 0xe0e0ff, |
| 88 | + wireframe: true |
76 | 89 |
|
77 | | - // |
| 90 | + } ); |
78 | 91 |
|
79 | | - geometry = new THREE.BoxBufferGeometry( size, size, size ); |
80 | | - geometry = geometry.toNonIndexed(); |
| 92 | + mesh1 = new THREE.Mesh( geometry, material ); |
| 93 | + mesh1.position.set( - 40, 0, 0 ); |
81 | 94 |
|
82 | | - setupAttributes( geometry ); |
| 95 | + scene.add( mesh1 ); |
83 | 96 |
|
84 | | - material = new THREE.ShaderMaterial( { |
85 | | - uniforms: {}, |
86 | | - vertexShader: document.getElementById( 'vertexShader' ).textContent, |
87 | | - fragmentShader: document.getElementById( 'fragmentShader' ).textContent |
88 | | - } ); |
| 97 | + // on the right |
89 | 98 |
|
90 | | - material.extensions.derivatives = true; |
| 99 | + var uniforms = { 'widthFactor': { value: API.widthFactor } }; |
91 | 100 |
|
92 | | - mesh = new THREE.Mesh( geometry, material ); |
93 | | - mesh.position.x = 150; |
94 | | - scene.add( mesh ); |
| 101 | + var material = new THREE.ShaderMaterial( { |
95 | 102 |
|
96 | | - // |
| 103 | + uniforms: uniforms, |
| 104 | + vertexShader: document.getElementById( 'vertexShader' ).textContent, |
| 105 | + fragmentShader: document.getElementById( 'fragmentShader' ).textContent, |
| 106 | + side: THREE.DoubleSide |
97 | 107 |
|
98 | | - geometry = new THREE.SphereBufferGeometry( size / 2, 32, 16 ); |
99 | | - geometry = geometry.toNonIndexed(); |
| 108 | + } ); |
100 | 109 |
|
101 | | - setupAttributes( geometry ); |
| 110 | + material.extensions.derivatives = true; |
| 111 | + |
| 112 | + geometry.removeAttribute( 'normal' ); |
| 113 | + geometry.removeAttribute( 'uv' ); |
| 114 | + |
| 115 | + setupAttributes( geometry ); |
| 116 | + |
| 117 | + mesh2 = new THREE.Mesh( geometry, material ); |
| 118 | + mesh2.position.set( 40, 0, 0 ); |
| 119 | + |
| 120 | + scene.add( mesh2 ); |
| 121 | + |
| 122 | + // |
| 123 | + |
| 124 | + animate(); |
102 | 125 |
|
103 | | - material = new THREE.ShaderMaterial( { |
104 | | - uniforms: {}, |
105 | | - vertexShader: document.getElementById( 'vertexShader' ).textContent, |
106 | | - fragmentShader: document.getElementById( 'fragmentShader' ).textContent |
107 | 126 | } ); |
108 | 127 |
|
109 | | - material.extensions.derivatives = true; |
| 128 | + // |
110 | 129 |
|
111 | | - mesh = new THREE.Mesh( geometry, material ); |
112 | | - mesh.position.x = - 150; |
113 | | - scene.add( mesh ); |
| 130 | + var gui = new GUI(); |
114 | 131 |
|
115 | | - // renderer |
| 132 | + gui.add( API, 'widthFactor', 0.4, 4 ).onChange( function () { |
116 | 133 |
|
117 | | - renderer = new THREE.WebGLRenderer( { antialias: true } ); |
118 | | - renderer.setPixelRatio( window.devicePixelRatio ); |
119 | | - renderer.setSize( window.innerWidth, window.innerHeight ); |
120 | | - document.body.appendChild( renderer.domElement ); |
| 134 | + mesh2.material.uniforms.widthFactor.value = API.widthFactor; |
121 | 135 |
|
122 | | - // events |
| 136 | + } ); |
| 137 | + |
| 138 | + gui.open(); |
| 139 | + |
| 140 | + // |
123 | 141 |
|
124 | 142 | window.addEventListener( 'resize', onWindowResize, false ); |
125 | 143 |
|
126 | 144 | } |
127 | 145 |
|
128 | 146 | function setupAttributes( geometry ) { |
129 | 147 |
|
130 | | - // TODO: Bring back quads |
131 | | - |
132 | 148 | var vectors = [ |
133 | 149 | new THREE.Vector3( 1, 0, 0 ), |
134 | 150 | new THREE.Vector3( 0, 1, 0 ), |
|
161 | 177 |
|
162 | 178 | requestAnimationFrame( animate ); |
163 | 179 |
|
164 | | - for ( var i = 0; i < scene.children.length; i ++ ) { |
| 180 | + mesh1.rotation.y += 0.01; |
165 | 181 |
|
166 | | - var object = scene.children[ i ]; |
167 | | - object.rotation.x += 0.005; |
168 | | - object.rotation.y += 0.01; |
169 | | - |
170 | | - } |
| 182 | + mesh2.rotation.y += 0.01; |
171 | 183 |
|
172 | 184 | renderer.render( scene, camera ); |
173 | 185 |
|
|
0 commit comments