Skip to content

Commit 4951a28

Browse files
authored
Merge pull request #16952 from WestLangley/dev_wireframe_example
Examples: Improve wireframe example
2 parents 04b15e3 + 94bcc8e commit 4951a28

File tree

1 file changed

+67
-55
lines changed

1 file changed

+67
-55
lines changed

examples/webgl_materials_wireframe.html

Lines changed: 67 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
void main() {
2020

2121
vCenter = center;
22+
2223
gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
2324

2425
}
@@ -27,20 +28,26 @@
2728

2829
<script type="x-shader/x-fragment" id="fragmentShader">
2930

31+
uniform float widthFactor;
32+
3033
varying vec3 vCenter;
3134

3235
float edgeFactorTri() {
3336

3437
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+
3641
return min( min( a3.x, a3.y ), a3.z );
3742

3843
}
3944

4045
void main() {
4146

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+
4451
}
4552

4653
</script>
@@ -49,86 +56,95 @@
4956

5057
import * as THREE from '../build/three.module.js';
5158

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;
5366

5467
init();
55-
animate();
5668

5769
function init() {
5870

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 );
6075

61-
var size = 150;
76+
scene = new THREE.Scene();
6277

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;
6580

66-
scene = new THREE.Scene();
81+
new THREE.BufferGeometryLoader().load( 'models/json/WaltHeadLo_buffergeometry.json', function ( geometry ) {
6782

68-
//
83+
// on the left
6984

70-
geometry = new THREE.BoxBufferGeometry( size, size, size );
71-
material = new THREE.MeshBasicMaterial( { wireframe: true } );
85+
var material = new THREE.MeshBasicMaterial( {
7286

73-
mesh = new THREE.Mesh( geometry, material );
74-
mesh.position.x = - 150;
75-
scene.add( mesh );
87+
color: 0xe0e0ff,
88+
wireframe: true
7689

77-
//
90+
} );
7891

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 );
8194

82-
setupAttributes( geometry );
95+
scene.add( mesh1 );
8396

84-
material = new THREE.ShaderMaterial( {
85-
uniforms: {},
86-
vertexShader: document.getElementById( 'vertexShader' ).textContent,
87-
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
88-
} );
97+
// on the right
8998

90-
material.extensions.derivatives = true;
99+
var uniforms = { 'widthFactor': { value: API.widthFactor } };
91100

92-
mesh = new THREE.Mesh( geometry, material );
93-
mesh.position.x = 150;
94-
scene.add( mesh );
101+
var material = new THREE.ShaderMaterial( {
95102

96-
//
103+
uniforms: uniforms,
104+
vertexShader: document.getElementById( 'vertexShader' ).textContent,
105+
fragmentShader: document.getElementById( 'fragmentShader' ).textContent,
106+
side: THREE.DoubleSide
97107

98-
geometry = new THREE.SphereBufferGeometry( size / 2, 32, 16 );
99-
geometry = geometry.toNonIndexed();
108+
} );
100109

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();
102125

103-
material = new THREE.ShaderMaterial( {
104-
uniforms: {},
105-
vertexShader: document.getElementById( 'vertexShader' ).textContent,
106-
fragmentShader: document.getElementById( 'fragmentShader' ).textContent
107126
} );
108127

109-
material.extensions.derivatives = true;
128+
//
110129

111-
mesh = new THREE.Mesh( geometry, material );
112-
mesh.position.x = - 150;
113-
scene.add( mesh );
130+
var gui = new GUI();
114131

115-
// renderer
132+
gui.add( API, 'widthFactor', 0.4, 4 ).onChange( function () {
116133

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;
121135

122-
// events
136+
} );
137+
138+
gui.open();
139+
140+
//
123141

124142
window.addEventListener( 'resize', onWindowResize, false );
125143

126144
}
127145

128146
function setupAttributes( geometry ) {
129147

130-
// TODO: Bring back quads
131-
132148
var vectors = [
133149
new THREE.Vector3( 1, 0, 0 ),
134150
new THREE.Vector3( 0, 1, 0 ),
@@ -161,13 +177,9 @@
161177

162178
requestAnimationFrame( animate );
163179

164-
for ( var i = 0; i < scene.children.length; i ++ ) {
180+
mesh1.rotation.y += 0.01;
165181

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;
171183

172184
renderer.render( scene, camera );
173185

0 commit comments

Comments
 (0)