【问题标题】:Applying Alpha Map to model using material causes model to show up as white使用材质将 Alpha Map 应用于模型会导致模型显示为白色
【发布时间】:2019-12-10 14:12:11
【问题描述】:

尝试使用 alpha 贴图根据 alpha 贴图揭示底层模型。目前,alpha 贴图会覆盖模型纹理并显示为全白。

我尝试单独加载 alpha 贴图并将其应用于材质,然后将其附加到对象上 --> 将相关的 alpha 贴图显示为白色,未按预期显示底层模型

我已经尝试将 alpha 贴图和纹理加载到 MeshBasicMaterial --> 显示完整的纹理,其中不透明

let material = new THREE.MeshBasicMaterial({
              // map: iceTexture,
              color: '0xffffff',
              transparent : false,
              side: THREE.DoubleSide,
              alphaTest: 0.5,
              alphaMap: this.alphaMaps[0]
            });

当前结果是 alpha 贴图显示为全白 --> Current Output

这是我希望显示的底层纹理(就在 alpha 贴图允许的地方)--> Underlying Texture

注意:我目前没有使用任何着色器,底层模型是一个简单的 glb,上面应用了冰纹理

注意 2:在this answer 中,它说要在第一个对象后面添加第二个对象...这不起作用,它只是在顶部显示对象,没有应用透明度

【问题讨论】:

  • 我很难理解您想要实现的目标。当您说“基础纹理”时,您的意思是在您应用alphaMap 的那个下面还有第二个Mesh?还是全部在一个网格中?看起来您已经注释掉了map: iceTexture,这意味着没有要采样的纹理,并且默认为您使用0xffffff 声明的白色。从您的屏幕截图来看,它的行为符合预期。
  • @Marquizzo 我尝试了两种方法,未​​注释 iceTexture(地图和 alphaMap 在同一材质上)它只是渲染完整的“底层纹理”,根本没有任何透明度。我也尝试过使用两个网格,一个将 alphaMap 应用于具有冰纹理的 glb,另一个是 glb 的第二个实例,没有应用任何 alpha 贴图,它再次呈现完整的“底层纹理”。我们的目标是让这些冰(你在“底层纹理”链接中看到的)慢慢显露出来,就像湖水结冰一样。
  • this.alphaMaps[0] 看起来像什么?请记住,.alphaMaponly reads the green channel,而不是 alpha 通道。如果您想要增加透明度,则需要从绿色到黑色渐变。
  • 这是我构造的数组中的第一个 alphaMap png,它是 [0]--> link 这是我构造的数组中的最终 alphaMap png,它是 [49]--> @ 987654326@
  • 是这样导入的const alphaMap = new THREE.TextureLoader().load(fileStr)

标签: three.js


【解决方案1】:

我认为让你感到困惑的是transparent: false,而应该是transparent: true。我刚刚尝试了(click here for a live CodePen demo) 下面的代码,透明度按预期工作。我也不认为您需要alphaTest: 0.5,因为您似乎有一个移动渐变的动画序列。

在演示中,我使用这张图片作为 alphaMap:

... 这张图片作为常规地图:

代码实质如下:

// Load the textures
const texLoader = new THREE.TextureLoader();
var alphaTexture = texLoader.load("https://i.imgur.com/aH0jI5N.png");
var mapTexture = texLoader.load("https://i.imgur.com/qdWJkbc.jpg");

// Create geometry
var geometry = new THREE.PlaneBufferGeometry(10, 10, 10, 10);

// Create a basic material
var material = new THREE.MeshBasicMaterial({ 
  map: mapTexture,
  alphaMap: alphaTexture,
  transparent: true
});

var plane = new THREE.Mesh( geometry, material );

【讨论】:

  • 谢谢。还有一些其他的皱纹,但这让我到了那里。对于任何试图在 A-Frame 中执行此操作的人……您不能使用 a-plane 原语。您需要使用a-entity,然后像上面的 sn-p 一样创建网格,然后使用setObject3D 将其添加到场景中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-27
  • 2021-04-05
  • 1970-01-01
  • 2017-01-01
  • 2022-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多