关于文章Custom Material Reference,我们可以传递Normal
,Diffuse
,Roughness
和Metalness
的值。
我想在Sceneform和ARCore中使用自定义PBR材质作为图像贴图(而不是值)。
示例地图:
答案 0 :(得分:0)
如果您使用的是obj
文件,则需要制作自定义材料。 Here is an example custom material拥有您所需的一切。
如果您使用的是fbx
文件,则默认情况下会提供这些文件:
baseColorMap
metallicMap
normalMap
roughnessMap
如果您使用的是gltf
文件,则需要将金属贴图和粗糙度贴图合并为一个。遮挡也可以打包到同一纹理贴图中。红色是咬合,绿色是粗糙的,蓝色是金属的。 sfa
文件中为此的参数是:
metallicRoughness
答案 1 :(得分:0)
已更新:查看底部的 A_void_void
内容,以了解如何将Mars.sfa
纹理分配给3D模型。
Sceneform提供了默认的材质定义(
.png
文件),使开发人员可以轻松获得美观的结果。希望深入定制资产外观方式的开发人员可以创建自己的物料定义(.sfm
文件),然后通过在资产定义中指定source属性将其应用于资产。
材料定义格式是一种基于JSON的格式。在顶层,材质定义由3个使用JSON对象表示法的块组成。
.mat
以下代码清单显示了有效材料定义的示例:
material {
// material properties
}
vertex {
// vertex shader, THIS BLOCK CAN BE OPTIONAL
}
fragment {
// fragment shader
}
或者片段部分可能是这样的:
material {
name : "Textured material",
parameters : [
{
type : sampler2d,
name : texture
},
{
type : float,
name : metallic
},
{
type : float,
name : roughness
}
],
requires : [
uv0
],
shadingModel : lit,
blending : opaque
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = texture(materialParams_texture, getUV0());
material.metallic = materialParams.metallic;
material.roughness = materialParams.roughness;
}
}
或者例如,查看这个名为
fragment { void material(inout MaterialInputs material) { // fetch the normal in tangent space vec3 normal = texture(materialParams_normalMap, getUV0()).xyz; material.normal = normal * 2.0 - 1.0; // prepare the material prepareMaterial(material); // from now on, shading_normal, etc. can be accessed material.baseColor.rgb = vec3(1.0, 0.0, 0.0); material.metallic = 0.0; material.roughness = 1.0; } }
的示例文件:
Mars.sfa