Javascript Three.js中着色器材质的透明度

Javascript Three.js中着色器材质的透明度,javascript,three.js,Javascript,Three.js,我试图通过扩展ShaderLib(例如ShaderLib.basic)中的着色器来创建自己的GLSL脚本,但不幸地遇到了一些透明度问题: 在下图中,直接使用MeshBasicMaterial看起来很正常 var material = new THREE.MeshBasicMaterial( params ); // color and opacity are set in params 但当我使用ShaderMaterial时,从窗户外面看不到里面的“一些”家具(这是一个奇怪的部分…) 但仍

我试图通过扩展ShaderLib(例如ShaderLib.basic)中的着色器来创建自己的GLSL脚本,但不幸地遇到了一些透明度问题:

在下图中,直接使用MeshBasicMaterial看起来很正常

var material = new THREE.MeshBasicMaterial( params ); // color and opacity are set in params
但当我使用ShaderMaterial时,从窗户外面看不到里面的“一些”家具(这是一个奇怪的部分…)

但仍然可以从里面看到。 ()

(这些材质用于具有缓冲几何体的多重材质。)


谢谢。

我认为问题在于,您的窗格玻璃是在内部之前渲染的,因此当内部没有渲染时,因为您的窗格玻璃在深度缓冲区中更接近摄影机(并且深度缓冲区不支持alpha)。我不确定,但在添加所有内部对象后,您可以尝试将玻璃窗格添加到场景中。谢谢,但现在所有对象都在一个网格对象中(使用BufferGeometry),因此如果我要将它们单独添加到网格中,是否应在多个网格中分离它们?或者你能告诉我其他方法吗?@Chao ChungYang(1)你确定
MulitMaterial/Basic
也不会出现问题吗?建筑物内的所有对象材质是否都具有透明=假?(2) 我希望渲染器尝试对具有相同
位置的多个对象进行排序。你能用r.75重新发布一个简单的实例吗?解决了!谢谢@WestLangley!问题是我不应该为非trasnparent材质设置“transparent=true”,即使它是“opacity=1”。你能解释一下原因吗?顺便说一句,我应该自己回答下面的问题并关闭线程吗?
transparent
标志会影响渲染顺序。如果在渲染建筑窗口后尝试渲染内部对象,则用例中将出现问题。。。如果没有一个简单的例子,您的用例不太可能向其他人提供信息,因此我将关闭或删除这篇文章。如果您不想这样做,那么您可以提供一个答案并接受它。我认为问题在于您的玻璃窗格在内部之前进行渲染,因此当内部没有渲染时,因为您的玻璃窗格在深度缓冲区中更接近摄影机(且深度缓冲区不支持alpha)。我不确定,但在添加所有内部对象后,您可以尝试将玻璃窗格添加到场景中。谢谢,但现在所有对象都在一个网格对象中(使用BufferGeometry),因此如果我要将它们单独添加到网格中,是否应在多个网格中分离它们?或者你能告诉我其他方法吗?@Chao ChungYang(1)你确定
MulitMaterial/Basic
也不会出现问题吗?建筑物内的所有对象材质是否都具有透明=假?(2) 我希望渲染器尝试对具有相同
位置的多个对象进行排序。你能用r.75重新发布一个简单的实例吗?解决了!谢谢@WestLangley!问题是我不应该为非trasnparent材质设置“transparent=true”,即使它是“opacity=1”。你能解释一下原因吗?顺便说一句,我应该自己回答下面的问题并关闭线程吗?
transparent
标志会影响渲染顺序。如果在渲染建筑窗口后尝试渲染内部对象,则用例中将出现问题。。。如果没有一个简单的例子,您的用例不太可能向其他人提供信息,因此我将关闭或删除这篇文章。如果你不想这样做,那么你可以提供一个答案并接受它。
var myShader = THREE.ShaderLib.basic;
var uniforms = THREE.UniformsUtils.clone( myShader.uniforms ); // color and opacity are set in uniforms
var material = new THREE.ShaderMaterial({
    uniforms: uniforms,
    vertexShader: myShader.vertexShader,
    fragmentShader: myShader.fragmentShader,
    transparent: true
});