THREE.js粒子纹理着色器

时间:2016-10-14 10:48:46

标签: javascript three.js glsl webgl shader

作为一项训练练习,我试图通过水银演示" luma"重新创建场景。 (https://www.youtube.com/watch?v=WBuoyegCeXI)。我确实有一些点大小的问题。我试图根据顶点和摄像机位置之间的距离来缩放pointSize,但它会导致奇怪的随机放大,例如下面的那个。

now that's a twinkle

它只发生在某些特定的位置。它导致的闪烁效果实际上非常酷,我想我稍后会以一种受控的方式实现它,但不幸的是,这不会做到。这是着色器的代码: [顶点]

uniform vec3 cameraPos;

void main() {
 float baseSize = 32.0;
 float distance = sqrt(dot(position, cameraPos));
 gl_PointSize = baseSize / (0.1 * distance);
 gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}

距离函数由于某种原因没有给我任何东西,而sqrt(dot())或多或少都有效。

[片段]

uniform sampler2D texture;

void main() {
   gl_FragColor = texture2D(texture, gl_PointCoord); 
}

three.js的材料代码

var shaderMaterial = new THREE.ShaderMaterial({
  uniforms: {
    texture: { type: "t", value: texture }
  },
  transparent: true,
  blending: THREE.AdditiveBlending,
  depthTest: false,
  vertexShader: document.getElementById('particleVertex').textContent,
  fragmentShader: document.getElementById('particleFragment').textContent,
})

如何使其表现?

0 个答案:

没有答案