1

参考文章:自定义材质参考,我们可以传递Normal, Diffuse,Roughness和的值Metalness

我想在 Sceneform 和 ARCore 中使用自定义 PBR 材质作为图像贴图(不是值)。

示例地图:

在此处输入图像描述

4

2 回答 2

2

更新:查看Mars.sfa底部的内容以了解如何将.png纹理分配给 3D 模型。

Sceneform 提供了默认的材质定义(.sfm文件),使开发人员可以轻松获得漂亮的结果。想要深度自定义资产外观方式的开发人员可以创建自己的材质定义(.mat文件),并通过在资产定义中指定源属性将它们应用到资产。

材料定义格式是一种松散地基于 JSON的格式。在顶层,材质定义由 3 个使用 JSON 对象表示法的不同块组成。

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

{
  materials: [
    {
      name: 'Mars_Atmosphere_Mat',
      parameters: [
        {
          baseColorFactor: [1,1,1,1,],
        },
        {
          baseColor: 'Mars_Atmosphere_Mat_baseColor',
        },
        {
          diffuseColorFactor: null,
        },
        {
          diffuseColor: null,
        },
        {
          normal: null,
        },
        {
          metallicFactor: 1,
        },
        {
          roughnessFactor: 1,
        },
        {
          specularFactor: null,
        },
        {
          glossinessFactor: null,
        },
        {
          specularGlossiness: null,
        },
        {
          specularGlossinessCalculation: null,
        },
        {
          metallicRoughness: null,
        },
        {
          occlusion: null,
        },
        {
          emissiveFactor: [0,0,0,1,],
        },
        {
          emissive: null,
        },
        {
          opacity: null,
        },
      ],
      source: 'build/sceneform_sdk/default_materials/gltf_material.sfm',
    },
    {
      name: 'Mars_mat',
      parameters: [
        {
          baseColorFactor: [1,1,1,1,],
        },
        {
          baseColor: 'Mars_mat_baseColor',
        },
        {
          diffuseColorFactor: null,
        },
        {
          diffuseColor: null,
        },
        {
          normal: 'Mars_mat_normal',
        },
        {
          metallicFactor: 0.33000000000000002,
        },
        {
          roughnessFactor: 0.85999999999999999,
        },
        {
          specularFactor: null,
        },
        {
          glossinessFactor: null,
        },
        {
          specularGlossiness: null,
        },
        {
          specularGlossinessCalculation: null,
        },
        {
          metallicRoughness: null,
        },
        {
          occlusion: null,
        },
        {
          emissiveFactor: [0,0,0,1,],
        },
        {
          emissive: null,
        },
        {
          opacity: null,
        },
      ],
      source: 'build/sceneform_sdk/default_materials/gltf_material.sfm',
    },
  ],
  model: {
    attributes: [
      'Position',
      'TexCoord',
      'Orientation',
    ],
    collision: {
      skin_width: 0.75,
    },
    file: 'sampledata/models/Mars/Mars.gltf',
    name: 'Mars',
    recenter: true,
    scale: 0.5,
  },
  samplers: [
    {
      file: 'sampledata/models/Mars/Mars_mat_baseColor.png',
      name: 'Mars_mat_baseColor',
      pipeline_name: 'Mars_mat_baseColor.png',
    },
    {
      file: 'sampledata/models/Mars/Mars_mat_normal.png',
      name: 'Mars_mat_normal',
      params: {
        usage_type: 'Normal',
      },
      pipeline_name: 'Mars_mat_normal.png',
    },
    {
      file: 'sampledata/models/Mars/Mars_Atmosphere_Mat_baseColor.png',
      name: 'Mars_Atmosphere_Mat_baseColor',
      pipeline_name: 'Mars_Atmosphere_Mat_baseColor.png',
    },
  ],
  version: '0.54:1',
}
于 2019-04-29T18:41:04.923 回答
0

OBJ 属性

如果您使用的是obj文件,则需要制作自定义材质。这是一个示例自定义材料,其中包含您需要的一切。

FBX 属性

如果您使用的是fbx文件,则默认情况下会提供这些:

  • baseColorMap
  • metallicMap
  • normalMap
  • roughnessMap

GLTF 属性

如果您使用的是gltf文件,则需要将金属贴图和粗糙度贴图合二为一。遮挡也可以打包到同一个纹理贴图中。红色是遮挡,绿色是粗糙度,蓝色是金属色。文件中的参数sfa是:

metallicRoughness

于 2019-02-13T12:22:45.327 回答