【问题标题】:How do I add two materials to a mesh that is already rendered on the canvas如何将两种材质添加到已经在画布上渲染的网格中
【发布时间】:2019-05-15 23:12:10
【问题描述】:

我正在尝试将颜色和图像添加到已经在画布上的threejs Mesh。据我所知,如果我使用相同的材​​料添加颜色和地图,它们将混合并且没有办法阻止它。所以如果我有一个白色的图像和一个黄色的颜色,颜色会将图像染成黄色:

let material = new THREE.MeshLambertMaterial({
               map: canvasTexture,
               color: 0xCECECE
               });

为了解决这个问题,我尝试向网格中添加两种材质。一张有颜色,一张有图片

let material0 = new THREE.MeshLambertMaterial({
                color: 0xCECECE
                });

let material1 = new THREE.MeshLambertMaterial({
                map: canvasTexture
              });

var materials = [material0, material1];

mesh.material = materials;

当我尝试将网格材质设置为材质数组时,它会变为空白,就好像它不接受该数组作为参数一样。尽管threejs文档说它接受一系列材料 https://threejs.org/docs/#api/en/objects/Mesh.material

我看到的另一个问题可能会发生,如果我让它工作,只有图像的材料将默认为白色,因此不会显示下面材料的颜色。

那么如何在不混合的情况下设置网格材质的图像和颜色。添加两种材料对我来说似乎过于复杂,从长远来看可能更难管理?

更新 所以我的问题最终是我使用的纹理是canvas texture。我需要将画布纹理中使用的画布的填充样式设置为不透明。比如:

ctx.fillStyle = "rgba(255, 255, 255, 0)";

然后我可以继续将多个材质以数组的形式添加到网格中。使用画布纹理作为贴图的材质也必须设置为透明。我还必须将 map.minfilter 设置为 THREE.LinearFilter。不知道为什么,但至少它现在可以工作了:)

let material0 = new THREE.MeshLambertMaterial({
    color: 0xf2f2f2
});

let material1 = new THREE.MeshLambertMaterial({
    map: canvasTexture,
    transparent: true
});
material1.map.minFilter = THREE.LinearFilter;

var materials = [material1, material0];
mesh.geometry.clearGroups();
mesh.geometry.addGroup( 0, 48, 0 ); 
mesh.geometry.addGroup( 0, 48, 1 ); 
mesh.material = materials;

希望这可以帮助某人。

【问题讨论】:

    标签: javascript three.js


    【解决方案1】:

    当我尝试将网格材质设置为材质数组时,它会变为空白,就好像它不接受该数组作为参数一样。

    这可能是因为您的几何没有定义任何groups data。这是使用多种材料的要求。

    所以如果我有一个白色图像和一个黄色颜色,颜色会将图像染成黄色

    这是预期的行为。材质的颜色与从漫反射纹理中采样的颜色值相乘。 TBH,不同的默认行为没有意义。

    那么如何在不混合的情况下设置网格材质的图像和颜色。

    如果您想用不同的材质渲染网格的不同部分,请为各个几何体定义组数据并使用多种材质。否则考虑复制网格并将一种材料分配给原始材料,将第二种材料分配给副本。通过将副本添加到原始 (mesh.add( copy )),您可以将两者保留在同一位置。

    【讨论】:

    • 我不明白为什么没有一个简单的属性来定义颜色和纹理如何混合。当然,这将适用于许多用例。你的两个选择似乎对我有用。组数据可能正是我正在寻找的。我也不知道我可以在网格中添加网格吗?所以在一个按钮上单击我得到网格,复制它,将原件的材料更改为颜色,将副本更改为纹理,然后将副本添加到原件?一旦我有机会尝试一下,如果任何一个选项都适合我,我会支持你的答案。谢谢
    猜你喜欢
    • 2021-08-14
    • 1970-01-01
    • 2023-03-23
    • 2022-10-14
    • 1970-01-01
    • 2021-10-22
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多