[Three.js]WebGL心形效果
WebGL,浏览器上的3D技术,基于OpenGL ES 2.0。基础教程可见Hi,WebGL!、Learning WebGL。
- function threeStart() {
- initScene();
- initParticles();
- initShape();
- initEmitter();
- animate();
- }
- window.addEventListener('load', threeStart, false);
浏览121-147行,THREE .ShaderMaterial的定义,其中attributes, uniforms,对应于GLSL内的变量,其type类型,在WebGLRenderer.js内搜索‘switch ( type )’即可找到。Vertex Shader&Fragment Shader如下:
- <!-- 顶点着色器 -->
- <script type="x-shader/x-vertex" id="vertexshader">
- attribute float size;
- attribute vec3 ca;
- varying vec3 vColor;
- void main() {
- vColor = ca;
- /*
- * 对于简单构造的粒子,可以用一个Object的各顶点表示粒子。
- * 利用gl_PointSize属性设置每个粒子大小。更快。
- */
- // 变换后的顶点坐标
- vec4 mvPosition = modelViewMatrix * vec4(position, 1.0);
- // 顶点大小
- gl_PointSize = size * (200.0 / length(mvPosition.xyz));
- // 输出顶点世界坐标
- gl_Position = projectionMatrix * mvPosition;
- }
- </script>
- <!-- 片元着色器 -->
- <script type="x-shader/x-fragment" id="fragmentshader">
- uniform vec3 color;
- uniform sampler2D texture;
- varying vec3 vColor;
- void main() {
- // 用gl_PointCoord设置纹理,不是UV坐标了
- vec4 outColor = texture2D(texture, gl_PointCoord);
- // 设定像素颜色 = 纹理颜色 * 顶点颜色
- gl_FragColor = outColor * vec4(color * vColor.xyz, 1.0);
- // 计算像素世界坐标z值
- float depth = gl_FragCoord.z / gl_FragCoord.w;
- // 雾颜色:黑
- const vec3 fogColor = vec3(0.0, 0.0, 0.0);
- // const vec3 fogColor = vec3(0xff, 0xff, 0xff);
- // 雾因素:depth<=200时0,>=600时1
- float fogFactor = smoothstep(200.0, 600.0, depth);
- // 混合雾的像素颜色
- gl_FragColor = mix(gl_FragColor, vec4(fogColor, gl_FragColor.w), fogFactor);
- }
- </script>
- // 沿形状路线运行
- timeOnShapePath += 0.01;
- if (timeOnShapePath > 1) timeOnShapePath -= 1;
- var pointOnShape = heartShape.getPointAt(timeOnShapePath);
- emitterpos.x = pointOnShape.x * 2 - 50;
- emitterpos.y = -pointOnShape.y * 2 + 100;
- // 设置需要更新
- group.geometry.verticesNeedUpdate = true; // 顶点
- attributes.size.needsUpdate = true; // 大小
- attributes.ca.needsUpdate = true; // 颜色