Как использовать материалы PBR в качестве карт изображений в Sceneform и ARCore? - PullRequest
0 голосов
/ 28 января 2019

Применительно к статье: Пользовательская ссылка на материал , мы можем передать значение для Normal, Diffuse, Roughness и Metalness.

Я хочуиспользовать пользовательский материал PBR в качестве карты изображения (не значения) в Sceneform и ARCore.

Пример карты:

enter image description here

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

ОБНОВЛЕНО : посмотрите на содержимое Mars.sfa внизу, чтобы узнать, как назначить .png текстуры для 3D-модели.

Sceneform предоставляет определения материалов по умолчанию (.sfm файлы), чтобы разработчикам было легко получать великолепные результаты.Разработчики, желающие глубоко настроить внешний вид своих активов, могут создавать свои собственные определения материалов (.mat файлы) и применять их к своим активам, указав атрибут источника в определении ресурса.

The формат определения материала - это формат , основанный на 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',
}
0 голосов
/ 13 февраля 2019

Атрибуты OBJ

Если вы используете файл obj, вам необходимо создать пользовательский материал. Вот пример пользовательского материала , который имеет все необходимое.

Атрибуты FBX

Если вы используете файл fbx, этопо умолчанию:

  • baseColorMap
  • metallicMap
  • normalMap
  • roughnessMap

Атрибуты GLTF

Если вы используете файл gltf, то вам нужно объединить карты металла и шероховатости в одну.Окклюзия также может быть упакована в ту же карту текстур.Красный - окклюзия, зеленая шероховатость и синий металлик.Параметр в файле sfa для этого:

metallicRoughness

...