我正在使用Three.js和ShaderMaterial使用Fragment Shader绘制Points Geometry。
我想让每个点都有模糊的边缘,但我无法让alpha起作用,它只会变成白色。
当像素完全透明时,我可以放弃它们以创建圆形,但是模糊效果会淡化到白色然后被突然截断。
以下是屏幕上显示的内容:
Three.JS 代码
先行感谢任何帮助 :) 这个问题困扰我很久。
编辑:深度测试开启和关闭的图像。在我看来,深度测试确实将它们按正确顺序放置了?
深度测试为false:
深度测试为true:
我想让每个点都有模糊的边缘,但我无法让alpha起作用,它只会变成白色。
当像素完全透明时,我可以放弃它们以创建圆形,但是模糊效果会淡化到白色然后被突然截断。
以下是屏幕上显示的内容:
![What I see on screen](https://istack.dev59.com/EVvTk.webp)
var shaderMaterial = new THREE.ShaderMaterial( {
uniforms: uniforms,
vertexShader: document.getElementById( 'vertexshader' ).textContent,
fragmentShader: document.getElementById( 'fragmentshader' ).textContent,
blending: THREE.NormalBlending,
depthTest: true,
transparent: true,
clipping: true
});
var points = new THREE.Points(geometry, shaderMaterial);
片元着色器:
//translate gl_PointCoord to be centered at 0,0
vec2 cxy = 2.0 * gl_PointCoord - 1.0;
//calculate alpha based on distance from centre
//(I'm doubling it to get a less gradual fade)
float newAlpha = (1.0-distance(cxy, vec2(0.0,0.0))) * 2.0;
if (newAlpha < 0.01)
{
//discard pixels that have ~0 alpha
discard;
}
gl_FragColor = vec4( newR, newG, newB, newAlpha);
先行感谢任何帮助 :) 这个问题困扰我很久。
编辑:深度测试开启和关闭的图像。在我看来,深度测试确实将它们按正确顺序放置了?
深度测试为false:
![depthTest:false](https://istack.dev59.com/SitFS.webp)
![depthTest:true](https://istack.dev59.com/DkhLE.webp)
depthTest: true
。由于粒子绘制的顺序是由几何体实例上的顶点位置设置的,因此粒子不会按照前后顺序渲染。导致渲染不正确。 - ScieCode