materialThree.js点加法混合模式破坏颜色,有没有更好的办法?
Additive blending mode destroying colour in point material Three.js, is there a better way?
我正在尝试将地图添加到点 material,该点在 Three.js 中具有彩色纹理。我已经尝试使用加法混合和贴图属性来获得圆点而不是方形点,但它会破坏纹理的颜色并将其与点的白色混合。我想知道是否有更好的方法将两者混合,这样我既可以保持粒子形状,又可以保持纹理的颜色?
这是 particle.png
let pointShape = new THREE.TextureLoader().load("./models/particle.png");
m = new THREE.PointsMaterial({
size: pointSize,
map: pointShape,
blending: THREE.AdditiveBlending,
depthTest: false,
opacity: 0.9,
onBeforeCompile: shader => {
shader.uniforms.tex = {value: new THREE.TextureLoader().load("./textures/earthlores.jpg")};
shader.vertexShader = `
varying vec2 vUv;
${shader.vertexShader}
`.replace(
`#include <begin_vertex>`,
`#include <begin_vertex>
vUv = uv;
`
);
//console.log(shader.vertexShader);
shader.fragmentShader = `
uniform sampler2D tex;
varying vec2 vUv;
${shader.fragmentShader}
`.replace(
`vec4 diffuseColor = vec4( diffuse, opacity );`,
`
vec3 col = texture2D(tex, vUv).rgb;
col *= diffuse;
vec4 diffuseColor = vec4( col, opacity );`
);
//console.log(shader.fragmentShader);
}
});
这是将纹理和粒子应用到点 material 的代码。
此代码的结果是这个褪色的、没有颜色的地球仪。
注释掉加法混合会得到正确的颜色,但不是正确的点形状。
我是否必须使用自定义混合来编辑我的混合模式、更改着色器或者是否有其他我完全缺少的方法?我尝试了其他混合模式,但它们似乎不起作用,我也不确定如何正确使用自定义混合,所以请像白痴一样向我解释,哈哈,我很想学习.
感谢任何帮助,谢谢!
好的,事实证明我已经找到了使用自定义混合的解决方案。使用添加方程式和 alpha 因子作为 source/destination(线性插值),将两者相加,但没有将目标颜色添加到源颜色。这使用提供的纹理创建了可爱的圆点。
m = new THREE.PointsMaterial({
size: pointSize,
map: pointShape,
blending: THREE.CustomBlending,
blendEquation: THREE.AddEquation,
blendSrc: THREE.SrcAlphaFactor,
blendDst:THREE.OneMinusSrcAlphaFactor,
depthTest: false
});
美味圆点:
我正在尝试将地图添加到点 material,该点在 Three.js 中具有彩色纹理。我已经尝试使用加法混合和贴图属性来获得圆点而不是方形点,但它会破坏纹理的颜色并将其与点的白色混合。我想知道是否有更好的方法将两者混合,这样我既可以保持粒子形状,又可以保持纹理的颜色?
let pointShape = new THREE.TextureLoader().load("./models/particle.png");
m = new THREE.PointsMaterial({
size: pointSize,
map: pointShape,
blending: THREE.AdditiveBlending,
depthTest: false,
opacity: 0.9,
onBeforeCompile: shader => {
shader.uniforms.tex = {value: new THREE.TextureLoader().load("./textures/earthlores.jpg")};
shader.vertexShader = `
varying vec2 vUv;
${shader.vertexShader}
`.replace(
`#include <begin_vertex>`,
`#include <begin_vertex>
vUv = uv;
`
);
//console.log(shader.vertexShader);
shader.fragmentShader = `
uniform sampler2D tex;
varying vec2 vUv;
${shader.fragmentShader}
`.replace(
`vec4 diffuseColor = vec4( diffuse, opacity );`,
`
vec3 col = texture2D(tex, vUv).rgb;
col *= diffuse;
vec4 diffuseColor = vec4( col, opacity );`
);
//console.log(shader.fragmentShader);
}
});
此代码的结果是这个褪色的、没有颜色的地球仪。
注释掉加法混合会得到正确的颜色,但不是正确的点形状。
我是否必须使用自定义混合来编辑我的混合模式、更改着色器或者是否有其他我完全缺少的方法?我尝试了其他混合模式,但它们似乎不起作用,我也不确定如何正确使用自定义混合,所以请像白痴一样向我解释,哈哈,我很想学习.
感谢任何帮助,谢谢!
好的,事实证明我已经找到了使用自定义混合的解决方案。使用添加方程式和 alpha 因子作为 source/destination(线性插值),将两者相加,但没有将目标颜色添加到源颜色。这使用提供的纹理创建了可爱的圆点。
m = new THREE.PointsMaterial({
size: pointSize,
map: pointShape,
blending: THREE.CustomBlending,
blendEquation: THREE.AddEquation,
blendSrc: THREE.SrcAlphaFactor,
blendDst:THREE.OneMinusSrcAlphaFactor,
depthTest: false
});
美味圆点: