javascript - Three.js ParticleSystem透明度问题

标签 javascript three.js webgl alphablending fragment-shader

我正在使用 Three.js 并且我有一个 ParticleSystem,其中每个粒子可能具有不同的透明度和颜色。

代码:

var shaderMaterial = new THREE.ShaderMaterial({
    uniforms: customUniforms,
    attributes: customAttributes,
    vertexShader: document.getElementById('vertexshader').textContent,
    fragmentShader: document.getElementById('fragmentshader').textContent,
    transparent: true,
    alphaTest: 0.5
});


particles = new THREE.ParticleSystem(geometry, shaderMaterial);
particles.dynamic = true;

顶点着色器:

attribute float size;
attribute vec3 color;

varying vec3 vColor;

void main() {

    vColor = color;

    vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );

    //gl_PointSize = size;
    gl_PointSize = size * ( 300.0 / length( mvPosition.xyz ) );

    gl_Position = projectionMatrix * mvPosition;

}

片段着色器:

uniform sampler2D texture;
uniform float alpha;
varying vec3 vColor;

void main() {
    gl_FragColor = vec4(vColor, 100);
    vec4 textureColor =  texture2D( texture, gl_PointCoord );
    gl_FragColor = gl_FragColor *  textureColor;
    gl_FragColor.a = alpha;
}

纹理是一个圆圈,但是当我设置 alpha 时,如下所示:gl_FragColor.a = alpha,我的纹理变成了一个黑色方 block 中的圆圈,alpha 级别还可以,但我不需要正方形,只有圆圈,如果我不设置 alpha,则不会出现正方形。 那么如何为提供的纹理正确设置 alpha?

最佳答案

看看这个:three.js - Adjusting opacity of individual particles

您可以在使用 ShaderMaterial for ParticleSystem 的页面某处找到 jsfiddle,变量 alpha:http://jsfiddle.net/yfSwK/27/

另外,至少改变一下片段着色器,gl_FragColor 应该是只写变量,通常不把它作为读变量:

vec4 col = vec4(vColor, 100);
vec4 tex = texture2D( texture, gl_PointCoord );
gl_FragColor = vec4( (col*tex).rgb, alpha );

...或在一行中:

gl_FragColor = vec4( (vec4(vColor, 100) *  texture2D( texture, gl_PointCoord )).rgb, alpha);

关于javascript - Three.js ParticleSystem透明度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19450150/

相关文章:

javascript - JavaScript 和 Lua 之间的细微差别

javascript - Three.js - 变换控件

opengl - 混合 OpenGL 和 WebGL

opengl-es - 绘制背面时,它们的法线是否自动反转?

javascript - 选择选项后如何使单选按钮显示为选中状态(CSS)

javascript - Ajax 和重写引擎

javascript - 通过单击 "button"在数组中添加值

javascript - THREE.js intersects[0].object.position 始终返回 (0,0,0)

javascript - 如何使用 THREE.OBJExporter

three.js - 在three.js中获取字体