gpt4 book ai didi

Three.js、自定义着色器和具有透明度的 png 纹理

转载 作者:行者123 更新时间:2023-12-02 19:10:04 24 4
gpt4 key购买 nike

我有一个非常简单的 PNG 纹理:带有透明背景的灰色圆圈。

PNG image with transparency

我将其用作THREE.ShaderMaterial的统一贴图:

var uniforms = THREE.UniformsUtils.merge( [basicShader.uniforms] );
uniforms['map'].value = THREE.ImageUtils.loadTexture( "img/particle.png" );
uniforms['size'].value = 100;
uniforms['opacity'].value = 0.5;
uniforms['psColor'].value = new THREE.Color( 0xffffff );

这是我的片段着色器(只是其中的一部分):

gl_FragColor = vec4( psColor, vOpacity );
gl_FragColor = gl_FragColor * texture2D( map,vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );
gl_FragColor = gl_FragColor * vec4( vColor, 1.0 );

我将该 Material 应用于一些粒子(THREE.PointCloud 网格),效果非常好:

Particles texture with transparency: OK!

但是如果我将相机旋转超过 180 度,我会看到以下内容:

Particles texture without transparency

据我了解,片段着色器未正确考虑 PNG 纹理的 alpha 值。

在这种情况下,获得正确的颜色和不透明度(来自自定义属性)并仍然从 PNG 中获得正确的 Alpha 的最佳方法是什么?

为什么它在一侧表现正确?

最佳答案

透明对象必须从后到前渲染——从最远到最近。这是因为深度缓冲区的原因。

但是PointCloud粒子不会根据距相机的距离进行排序。那效率就太低了。无论相机位置如何,粒子始终以相同的顺序渲染。

您有多种解决方法。

第一个是丢弃 alpha 较低的片段。您可以使用如下模式:

if ( textureColor.a < 0.5 ) discard;

另一个选项是设置 material.depthTest = falsematerial.depthWrite = false。 但是,如果您还有其他对象,您可能不喜欢这些副作用。现场。

三.js r.71

关于Three.js、自定义着色器和具有透明度的 png 纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31037195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com