Referensi materi kustom

Sceneform menyediakan definisi material default (.sfm) untuk memudahkan developer mendapatkan hasil yang terlihat baik. Developer yang ingin menyesuaikan tampilan aset mereka secara mendalam dapat membuat definisi material mereka sendiri (file *.mat) dan menerapkannya ke aset mereka dengan menentukan atribut source di definisi aset.

Konsep inti

Material
Material menentukan tampilan visual permukaan. Untuk sepenuhnya mendeskripsikan dan merender permukaan, material memberikan informasi berikut:
  • Model material
  • Kumpulan parameter bernama yang dapat dikontrol penggunaan
  • Status Raster (mode blending, backface culling, dll.)
  • Kode shader vertex
  • Kode shader fragmen
Model material
Disebut juga model bayangan atau model pencahayaan, model material menentukan properti intrinsik suatu permukaan. Properti ini memiliki pengaruh langsung terhadap cara komputasi yang dihitung, sehingga muncul di permukaan.
Definisi material
File teks yang menjelaskan semua informasi yang diperlukan oleh bahan. Halaman ini menjelaskan struktur dan format file definisi materi (*.mat).

Definisi material

Definisi material adalah file teks yang menjelaskan semua informasi yang diperlukan oleh bahan:

  • Name
  • Parameter pengguna
  • Model material
  • Atribut yang diperlukan
  • Interpolin (disebut variabel)
  • Status raster (mode pencampuran, dll.)
  • Kode shader (shader fragmen, shader vertex opsional)

Format

Format definisi material adalah format yang digunakan secara bebas berdasarkan JSON yang kami sebut JSONish. Di tingkat atas, definisi material terdiri dari 3 blok berbeda yang menggunakan notasi objek JSON:

material {
    // material properties
}

vertex {
    // vertex shader, optional
}

fragment {
    // fragment shader
}

Definisi material minimum yang valid harus berisi blok material dan blok fragment. Blok vertex bersifat opsional.

Perbedaan dengan JSON

Di JSON, objek terdiri dari pasangan kunci/nilai. Pasangan JSON memiliki sintaksis berikut:

"key" : value

Jika nilai dapat berupa string, angka, objek, array, atau literal (true, false, atau null). Meskipun sintaksis ini sangat valid dalam definisi material, varian tanpa tanda kutip di sekitar string juga diterima dalam JSONish:

key : value

Tanda kutip tetap wajib ada jika string berisi spasi.

Blok vertex dan fragment berisi kode GLSL tanpa tanda kutip dan tanpa tanda kutip, yang tidak valid di JSON.

Komentar gaya C++ baris tunggal diizinkan.

Kunci pasangan peka huruf besar/kecil.

Nilai pasangan tidak peka huruf besar/kecil.

Contoh

Listingan kode berikut menampilkan contoh definisi material yang valid. Definisi ini menggunakan model material lit, menggunakan mode pencampuran buram default, mengharuskan serangkaian koordinat UV ditampilkan dalam mesh yang dirender dan menentukan 3 parameter pengguna. Bagian-bagian berikut dalam dokumen ini menjelaskan blok material dan fragment secara mendetail.

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;
    }
}

Blok material

Blok material adalah blok wajib yang berisi daftar pasangan properti untuk menjelaskan semua data non-shader.

name

Jenis
string
Nilai
String apa pun. Tanda kutip ganda wajib diisi jika nama berisi spasi.
Deskripsi
Menetapkan nama materi. Nama ini disimpan saat runtime untuk tujuan proses debug.
material {
    name : stone
}

material {
    name : "Wet pavement"
}

shadingModel

Jenis
string
Nilai
Apa pun dari lit, cloth, unlit. Nilai defaultnya adalah lit.
Deskripsi
Memilih model material seperti yang dijelaskan di bagian Model material.
material {
    shadingModel : unlit
}

parameter

Jenis
array objek parameter
Nilai

Setiap entri merupakan objek dengan properti name dan type, keduanya, dari jenis string. Nama harus berupa ID GLSL yang valid. Jenisnya harus berupa salah satu jenis yang dijelaskan dalam tabel di bawah.

Jenis Deskripsi
bool Boolean tunggal
Bool2 Vektor 2 boolean
Bool3 Vektor 3 boolean
Bool4 Vektor 4 boolean
float Float tunggal
float2 Vektor 2 float
float3 Vektor 3 float
float4 Vektor 4 float
int Bilangan bulat tunggal
Int2 Vektor dari 2 bilangan bulat
Int3 Vektor dari 3 bilangan bulat
Int4 Vektor dari 4 bilangan bulat
sampel2d Tekstur 2D
samplerEksternal Tekstur eksternal. Untuk informasi selengkapnya, lihat ExternalTexture dan setExternalTexture()
Sampel

Jenis sampler juga dapat menentukan format (default-nya adalah float) dan precision (default-nya adalah default). Formatnya bisa berupa salah satu dari int, float. Presisinya bisa berupa salah satu dari default (presisi terbaik untuk platform, biasanya high di desktop, medium di perangkat seluler), low, medium, high.

Deskripsi

Mencantumkan parameter yang diperlukan oleh material Anda. Parameter ini dapat disetel pada waktu proses menggunakan API material Sceneform. Cara mengakses parameter dari shader bervariasi bergantung pada jenis parameternya:

  • Jenis sampler: gunakan nama parameter yang diawali dengan materialParams_. Misalnya, materialParams_myTexture.
  • Jenis lainnya: gunakan nama parameter sebagai kolom struktur yang disebut materialParams. Misalnya, materialParams.myColor.
material {
    parameters : [
        {
           type : float4,
           name : albedo
        },
        {
           type      : sampler2d,
           format    : float,
           precision : high,
           name      : roughness
        },
        {
            type : float2,
            name : metallicReflectance
        }
    ],
    requires : [
        uv0
    ],
    shadingModel : lit,
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = materialParams.albedo;
        material.roughness = texture(materialParams_roughness, getUV0());
        material.metallic = materialParams.metallicReflectance.x;
        material.reflectance = materialParams.metallicReflectance.y;
    }
}

memerlukan

Jenis
array string
Nilai
Setiap entri harus berupa uv0, uv1, color, tangents.
Deskripsi
Mencantumkan atribut vertex yang diperlukan oleh material. Atribut position disertakan secara otomatis dan tidak perlu ditentukan. Atribut tangents secara otomatis diperlukan saat memilih model bayangan apa pun yang bukan unlit. Lihat bagian shader dalam dokumen ini untuk informasi selengkapnya tentang cara mengakses atribut ini dari shader.
material {
    parameters : [
        {
           type : sampler2d,
           name : texture
        },
    ],
    requires : [
        uv0
    ],
    shadingModel : lit,
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor = texture(materialParams_texture, getUV0());
    }
}

variabel

Jenis
array string
Nilai
Hingga 4 string, masing-masing harus berupa ID GLSL yang valid.
Deskripsi
Menentukan interpolasi kustom (atau variabel) yang dihasilkan oleh shader vertex bahan. Setiap entri array menentukan nama interpolant. Nama lengkap di shader fragmen adalah nama interpolant dengan awalan variable_. Misalnya, jika Anda mendeklarasikan variabel bernama eyeDirection, Anda dapat mengaksesnya di shader fragmen menggunakan variable_eyeDirection. Dalam shader vertex, nama interpolant hanya merupakan anggota struktur MaterialVertexInputs (material.eyeDirection dalam contoh Anda). Setiap interpolan adalah jenis float4 (vec4) dalam shader.
material {
    name : Skybox,
    parameters : [
        {
           type : sampler2d,
           name : skybox
        }
    ],
    variables : [
         eyeDirection
    ],
    vertexDomain : device,
    depthWrite : false,
    shadingModel : unlit
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        float theta = acos(variable_eyeDirection.y);
        float phi = atan(variable_eyeDirection.z / variable_eyeDirection.x) +
            (variable_eyeDirection.x > 0.0 ? 0.0 : PI);
        material.baseColor = texture(materialParams_skybox,
            vec2((phi + PI / 2.0) / (2.0 * PI), theta / PI));
    }
}

vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        float3 p = getPosition().xyz;
        float3 u = mulMat4x4Float3(getViewFromClipMatrix(), p).xyz;
        material.eyeDirection.xyz = mulMat3x3Float3(getWorldFromViewMatrix(), u);
    }
}

memadukan

Jenis
string
Nilai
Apa pun dari opaque, transparent, fade, add, masked. Nilai defaultnya adalah opaque.
Deskripsi

Menentukan bagaimana/jika objek yang dirender dicampur dengan konten target render. Mode penggabungan yang mungkin adalah:

  • buram: pencampuran dinonaktifkan, saluran alfa output material diabaikan.
  • Transparan: pencampuran diaktifkan. Output material digabungkan dengan alfa dengan target render, menggunakan aturan sumber di atas Porter-Duff. Mode penggabungan ini mengasumsikan alfa yang diperkalikan sebelumnya.
  • Fade: bertindak sebagai transparent, tetapi transparansi juga diterapkan ke penerangan spesifik. Dalam mode transparent, nilai alfa material hanya berlaku untuk pencahayaan difusi. Mode penggabungan ini berguna untuk memudarkan objek yang terang masuk dan keluar.
  • Tambahkan: pencampuran diaktifkan. Output material ditambahkan ke konten target render.
  • Disamarkan: pencampuran dinonaktifkan. Mode pencampuran ini memungkinkan masking alfa. Saluran alfa output material menentukan apakah fragmen akan dihapus atau tidak. Lihat bagian maskThreshold untuk informasi lebih lanjut.
material {
    blending : transparent
}

Domain vertex

Jenis
string
Nilai
Apa pun dari object, world, view, device. Nilai defaultnya adalah object.
Deskripsi

Menentukan domain (atau ruang koordinat) dari mesh yang dirender. Domain memengaruhi cara verteks diubah dalam shader vertex. Domain yang mungkin adalah:

  • Object: verteks ditentukan dalam ruang koordinat objek (atau model). vertex diubah menggunakan matriks transformasi objek yang dirender
  • Dunia: vertex ditentukan dalam ruang koordinat dunia. Verteks tidak diubah menggunakan transformasi objek yang dirender.
  • Tampilan: verteks ditentukan dalam ruang koordinat tampilan (atau mata atau kamera). vertex tidak diubah menggunakan transformasi objek yang dirender.
  • Perangkat: verteks ditentukan dalam ruang koordinat (atau klip) perangkat yang dinormalisasi. vertex tidak diubah menggunakan transformasi objek yang dirender.
material {
    vertexDomain : device
}

interpolasi

Jenis
string
Nilai
Apa pun dari smooth, flat. Default-nya adalah smooth.
Deskripsi
Menentukan cara interpolasi (atau variabel) diinterpolasi antar verteks. Jika properti ini ditetapkan ke smooth, interpolasi yang benar dari perspektif akan dilakukan pada setiap interpolasi. Jika ditetapkan ke flat, tidak ada interpolasi yang dilakukan dan semua fragmen dalam segitiga tertentu akan diarsir sama.
material {
    interpolation : flat
}

Culing

Jenis
string
Nilai
Apa pun dari none, front, back, frontAndBack. Nilai defaultnya adalah back.
Deskripsi
Menentukan segitiga yang harus dicabut: tidak ada, segitiga yang menghadap ke depan, segitiga yang menghadap ke belakang, atau semuanya.
material {
    culling : none
}

penulisan warna

Jenis
boolean
Nilai
true atau false. Default-nya adalah true.
Deskripsi
Mengaktifkan atau menonaktifkan penulisan ke buffer warna.
material {
    colorWrite : false
}

DepthWrite

Jenis
boolean
Nilai
true atau false. Default-nya adalah true.
Deskripsi
Mengaktifkan atau menonaktifkan penulisan ke buffer kedalaman.
material {
    depthWrite : false
}

KedalamanCulling

Jenis
boolean
Nilai
true atau false. Default-nya adalah true.
Deskripsi
Mengaktifkan atau menonaktifkan pengujian kedalaman. Jika pengujian kedalaman dinonaktifkan, objek yang dirender dengan material ini akan selalu muncul di atas objek buram lainnya.
material {
    depthCulling : false
}

Dua Sisi

Jenis
boolean
Nilai
true atau false. Default-nya adalah false.
Deskripsi
Mengaktifkan atau menonaktifkan rendering dua sisi. Jika ditetapkan ke true, culling akan otomatis disetel ke none. Jika segitiga menghadap ke belakang, segitiga tersebut normal akan otomatis dibalik menjadi menghadap ke depan.
material {
    doubleSided : true
}

transparansi

Jenis
string
Nilai
Salah satu dari default, twoPassesOneSide, atau twoPassesTwoSides. Nilai defaultnya adalah default.
Deskripsi
Mengontrol cara objek transparan dirender. Ini hanya valid jika mode blending bukan opaque. Tak satu pun dari metode ini yang dapat merender geometri cekung secara akurat, tetapi dalam praktiknya metode ini sering kali cukup baik.

Tiga kemungkinan mode transparansi adalah:

  • default: objek transparan dirender secara normal, dengan mematuhi mode culling, dll.

  • twoPassesOneSide: objek transparan dirender pertama dalam buffer kedalaman, lalu diikuti lagi dalam buffer warna, untuk mematuhi mode cullling. Ini secara efektif hanya merender setengah dari objek transparan seperti yang ditunjukkan di bawah ini.

  • twoPassesTwoSides: objek transparan dirender dua kali dalam buffering warna: pertama dengan wajah belakangnya, lalu dengan wajah depan. Mode ini memungkinkan Anda merender kedua set wajah sekaligus mengurangi atau menghilangkan masalah pengurutan, seperti yang ditunjukkan di bawah ini. twoPassesTwoSides dapat digabungkan dengan doubleSided untuk menghasilkan efek yang lebih baik.

material {
    transparency : twoPassesOneSide
}

maskThreshold

Jenis
number
Nilai
Nilai antara 0.0 dan 1.0. Default-nya adalah 0.4.
Deskripsi
Menetapkan nilai alfa minimum yang harus dihapus oleh fragmen jika mode blending ditetapkan ke masked. Jika mode penggabungan bukan masked, nilai ini akan diabaikan. Nilai ini dapat digunakan untuk mengontrol tampilan objek yang disamarkan alfa.
material {
    blending : masked,
    maskThreshold : 0.5
}

pengganda bayangan

Jenis
boolean
Nilai
true atau false. Default-nya adalah false.
Deskripsi
Hanya tersedia dalam model bayangan unlit. Jika properti ini diaktifkan, warna akhir yang dihitung oleh material dikalikan dengan faktor bayangan (atau visibilitas). Hal ini memungkinkan pembuatan objek penerima bayangan transparan (misalnya bidang permukaan tanah yang tidak terlihat dalam AR).
material {
    name : "Invisible shadow plane",
    shadingModel : unlit,
    shadowMultiplier : true,
    blending : transparent
}

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        // baseColor defines the color and opacity of the final shadow
        material.baseColor = vec4(0.0, 0.0, 0.0, 0.7);
    }
}

varianFilter

Jenis
array string
Nilai
Setiap entri harus berupa dynamicLighting, directionalLighting, shadowReceiver, atau skinning.
Deskripsi
Digunakan untuk menentukan daftar varian shader yang dijamin oleh aplikasi tidak akan pernah diperlukan. Varian shader ini dilewati selama fase pembuatan kode, sehingga mengurangi ukuran keseluruhan material. Perlu diperhatikan bahwa beberapa varian mungkin akan otomatis difilter. Misalnya, semua varian terkait penerangan (directionalLighting, dll.) difilter saat mengompilasi material unlit. Gunakan filter varian dengan hati-hati, memfilter varian yang diperlukan saat runtime dapat menyebabkan error.

Deskripsi varian: - directionalLighting, digunakan saat ada cahaya terarah dalam adegan - dynamicLighting, yang digunakan saat ada cahaya arah (titik, titik, dll.) yang ada dalam scene - shadowReceiver, yang digunakan saat objek dapat menerima bayangan - skinning, yang digunakan saat objek dianimasikan menggunakan GPU GPU

material {
    name : "Invisible shadow plane",
    shadingModel : unlit,
    shadowMultiplier : true,
    blending : transparent,
    variantFilter : [ skinning ]
}

Blok vertex

Blok vertex bersifat opsional dan dapat digunakan untuk mengontrol tahap shading vertex bahan. Blok vertex harus berisi kode ESSL 3.0 yang valid (versi GLSL yang didukung di OpenGL ES 3.0). Anda bebas membuat beberapa fungsi di dalam blok vertex, tetapi harus mendeklarasikan fungsi materialVertex:

vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        // vertex shading code
    }
}

Fungsi ini akan otomatis dipanggil pada waktu proses oleh sistem bayangan dan memberi Anda kemampuan untuk membaca dan mengubah properti material menggunakan struktur MaterialVertexInputs. Definisi lengkap struktur ini dapat ditemukan di bagian Input vertex material.

Anda dapat menggunakan struktur ini untuk menghitung variabel/interpolan kustom atau mengubah nilai atribut. Misalnya, blok vertex berikut mengubah warna dan koordinat UV vertex dari waktu ke waktu:

material {
    requires : [uv0, color]
}
vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        material.color *= sin(getTime());
        material.uv0 *= sin(frameUniforms.time);
    }
}

Selain struktur MaterialVertexInputs, kode bayangan verteks Anda dapat menggunakan semua API publik yang tercantum di bagian API publik Shader.

Input vertex material

struct MaterialVertexInputs {
    float4 color;         // if the color attribute is required
    float2 uv0;           // if the uv0 attribute is required
    float2 uv1;           // if the uv1 attribute is required
    float3 worldNormal;   // only if the shading model is not unlit
    float4 worldPosition; // always available
    // variable* names are replaced with actual names
    float4 variable0;     // if 1 or more variables is defined
    float4 variable1;     // if 2 or more variables is defined
    float4 variable2;     // if 3 or more variables is defined
    float4 variable3;     // if 4 or more variables is defined
};

Blok fragmen

Blok fragmen harus digunakan untuk mengontrol tahap bayangan fragmen bahan. Blok fragmen harus berisi kode ESSL 3.0 yang valid (versi GLSL yang didukung di OpenGL ES 3.0). Anda bebas membuat beberapa fungsi di dalam blok vertex, tetapi harus mendeklarasikan fungsi material:

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        // fragment shading code
    }
}

Fungsi ini akan otomatis dipanggil pada waktu proses oleh sistem bayangan dan memberi Anda kemampuan untuk membaca dan mengubah properti material menggunakan struktur MaterialInputs. Definisi lengkap struktur ini dapat ditemukan di bagian input fragmen Material. Definisi lengkap berbagai anggota struktur dapat ditemukan di bagian Model material dalam dokumen ini.

Sasaran fungsi material() adalah menghitung properti material khusus untuk model bayangan yang dipilih. Misalnya, berikut adalah blok fragmen yang membuat logam merah mengkilap menggunakan model bayangan teduh standar:

fragment {
    void material(inout MaterialInputs material) {
        prepareMaterial(material);
        material.baseColor.rgb = vec3(1.0, 0.0, 0.0);
        material.metallic = 1.0;
        material.roughness = 0.0;
    }
}

fungsi persiapanMaterial

Perhatikan bahwa Anda harus memanggil prepareMaterial(material) sebelum keluar dari fungsi material(). Fungsi prepareMaterial ini menyiapkan status internal model material. Beberapa API yang dijelaskan di bagian API Fragment - seperti shading_normal - hanya dapat diakses setelah memanggil prepareMaterial().

Penting juga untuk diingat bahwa properti normal - seperti yang dijelaskan di bagian Input fragmen material - hanya memiliki efek saat diubah sebelum memanggil prepareMaterial(). Berikut adalah contoh shader fragmen yang mengubah properti normal dengan benar untuk menerapkan plastik merah mengkilap dengan pemetaan lonjakan:

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;
    }
}

Input fragmen material

struct MaterialInputs {
    float4 baseColor;           // default: float4(1.0)
    float4 emissive;            // default: float4(0.0)

    // no other field is available with the unlit shading model
    float  roughness;           // default: 1.0
    float  metallic;            // default: 0.0, not available with cloth
    float  reflectance;         // default: 0.5, not available with cloth
    float  ambientOcclusion;    // default: 0.0

    // not available when the shading model is cloth
    float  clearCoat;           // default: 1.0
    float  clearCoatRoughness;  // default: 0.0
    float3 clearCoatNormal;     // default: float3(0.0, 0.0, 1.0)
    float  anisotropy;          // default: 0.0
    float3 anisotropyDirection; // default: float3(1.0, 0.0, 0.0)


    // only available when the shading model is cloth
    float3 sheenColor;         // default: sqrt(baseColor)
    float3 subsurfaceColor;    // default: float3(0.0)

    // not available when the shading model is unlit
    // must be set before calling prepareMaterial()
    float3 normal;             // default: float3(0.0, 0.0, 1.0)
}

Shader API publik

Jenis

Meskipun jenis GLSL dapat digunakan langsung (vec4 atau mat4), sebaiknya gunakan jenis alias berikut:

Name Jenis GLSL Deskripsi
bool2 bvec2 Vektor 2 boolean
bool3 Bvec3 Vektor 3 boolean
bool4 Bvec4 Vektor 4 boolean
int2 ivec2 Vektor 2 bilangan bulat
int3 ivec3 Vektor 3 bilangan bulat
int4 ivec4 Vektor 4 bilangan bulat
uint2 Uvec2 Vektor 2 bilangan bulat tanpa tanda tangan
uint3 Uvec3 Vektor 3 bilangan bulat tanpa tanda tangan
uint4 Uvec4 Vektor 4 bilangan bulat tanpa tanda tangan
float2 float2 Vektor 2 float
float3 float3 Vektor 3 float
float4 float4 Vektor 4 float
float4x4 Mate4 Matriks float 4x4
float3x3 Mat3 Matriks float 3x3

Math

Name Jenis Deskripsi
PI float Konstanta yang mewakili \(\pi\)
SETENGAH_PI float Konstanta yang merepresentasikan \(\frac{\pi}{2}\)
saturasi(float x) float Memotong nilai yang ditentukan antara 0,0 dan 1,0
pow5(float x) float Komputasi \(x^5\)
sq(float x) float Komputasi \(x^2\)
max3(float3 v) float Menampilkan nilai maksimum float3 yang ditentukan
mulMat4x4Float3(float4x4 m, float3 v) float4 Hasil \(m * v\)
mulMat3x3Float3(float4x4 m, float3 v) float4 Hasil \(m * v\)

Matriks

Name Jenis Deskripsi
getViewFromWorldMatrix() float4x4 Matriks yang mengkonversi dari ruang dunia ke ruang pandang/mata
getWorldFromViewMatrix() float4x4 Matriks yang mengonversi ruang pandang/mata ke ruang dunia
getClipFromViewMatrix() float4x4 Matriks yang mengonversi ruang lihat/mata menjadi ruang klip (NDC)
getViewFromClipMatrix() float4x4 Matriks yang mengonversi ruang klip (NDC) menjadi ruang pandang/mata
getClipFromWorldMatrix() float4x4 Matriks yang dikonversi dari dunia ke ruang klip (NDC)

Konstanta frame

Name Jenis Deskripsi
getResolution() float4 Resolusi tampilan dalam piksel: width, height, 1 / width, 1 / height
getWorldCameraPosition() float3 Posisi kamera/mata di ruang dunia
getTime() float Waktu dalam detik sejak mesin Sceneform diinisialisasi, dapat direset secara rutin untuk menghindari kehilangan presisi
getExposure() float Eksposur fotometrik kamera
getEV100() float Nilai eksposur pada ISO 100 kamera

Khusus Vertex

API berikut hanya tersedia dari blok vertex:

Name Jenis Deskripsi
getPosition() float4 Posisi Vertex dalam domain yang ditentukan oleh material (default: object/model space)
getWorldFromModelMatrix() float4x4 Matriks yang dikonversi dari ruang model (objek) ke ruang dunia
getWorldFromModelNormalMatrix() float3x3 Matriks yang mengonversi ruang normal dari model (objek) ke ruang dunia

Hanya fragmen

API berikut hanya tersedia dari blok fragmen:

Name Jenis Deskripsi
getWorldTangentFrame() float3x3 Matriks yang berisi setiap kolom tangent (frame[0]), bi-tangent (frame[1]) dan normal (frame[2]) vertex di ruang dunia. Jika material tidak menghitung ruang tangen normal untuk pemetaan lonjakan atau jika bayangan tidak anisotropik, hanya normal yang valid dalam matriks ini.
getWorldPosition() float3 Posisi fragmen di ruang dunia
getWorldViewVector() float3 Vektor yang dinormalkan di ruang dunia dari posisi fragmen ke mata
getWorldNormalVector() float3 Dinormalkan normal di ruang dunia, setelah pemetaan lonjakan (harus digunakan setelah prepareMaterial())
getWorldReflectedVector() float3 Refleksi vektor tampilan tentang normal (harus digunakan setelah prepareMaterial())
getNdotV() float Hasil dot(normal, view), selalu benar-benar lebih besar dari 0 (harus digunakan setelah prepareMaterial())
getColor() float4 Warna interpolasi fragmen, jika atribut warna diperlukan
getUV0() float2 Set koordinat UV yang pertama diinterpolasi, jika atribut uv0 diperlukan
getUV1() float2 Set koordinat UV yang pertama diinterpolasi, jika atribut uv1 diperlukan
inverseTonemap(float3) float3 Menerapkan operator pemetaan nada terbalik pada warna sRGB linear yang ditentukan. Operasi ini mungkin perkiraan
inverseTonemapSRGB(float3) float3 Menerapkan operator pemetaan nada terbalik ke warna sRGB non-linear yang ditentukan. Operasi ini mungkin merupakan perkiraan
luminans(float3) float Menghitung luminans warna sRGB linear yang ditentukan

Model material

Materi bentuk tampilan dapat menggunakan salah satu model material berikut:

  • Lit (atau standar)
  • Kain
  • Tidak terang

Model Lit

Model yang menyala adalah model material standar Sceneform. Model bayangan berbasis fisik ini dirancang setelah menawarkan interoperabilitas yang baik dengan alat dan mesin umum lainnya seperti Unity 5, Unreal Engine 4, Substance Designer, atau Marmoset Toolbag.

Model material ini dapat digunakan untuk mendeskripsikan sejumlah besar permukaan non-logam (dielektrik) atau permukaan logam (konduktor).

Tampilan material menggunakan model standar dikontrol menggunakan properti yang dijelaskan dalam tabel di bawah.

Properti model standar

Properti Definisi
baseColor Albedo difusi untuk permukaan non-logam, dan warna melingkar untuk permukaan metalik
metalik Apakah permukaan tampak dielektrik (0.0) atau konduktor (1.0). Sering kali digunakan sebagai nilai biner (0 atau 1)
kekasaran Kehalusan yang dirasakan (1.0) atau kekasaran (0.0) dari permukaan. Permukaan halus memperlihatkan pantulan yang tajam
refleksi Refleksi Fresnel pada insiden normal untuk permukaan dielektrik. Ini secara langsung mengontrol kekuatan refleksi
clearCoat Kekuatan lapisan lapisan bening
clearCoatRoughness Kelancaran atau kekasaran yang dirasakan dari lapisan lapisan bening
anisotropi Jumlah anisotropi dalam arah tangen atau bitan
anisotropyDirection Arah permukaan lokal
ambientOcclusion Menentukan seberapa banyak cahaya sekitar yang dapat diakses oleh titik permukaan. Ini adalah faktor bayangan per piksel antara 0,0 dan 1,0
normal Detail normal yang digunakan untuk mengganggu permukaan menggunakan pemetaan lonjakan (pemetaan normal)
clearCoatNormal Detail normal yang digunakan untuk mengganggu lapisan lapisan jelas menggunakan pemetaan bump (pemetaan normal)
mengembangkan Albedo difusi tambahan untuk menyimulasikan permukaan emisi (seperti neon, dll.) Properti ini sangat berguna dalam pipeline HDR dengan bloom pass

Jenis dan rentang setiap properti dijelaskan dalam tabel di bawah.

Properti Jenis Rentang Catatan
baseColor float4 [0,1] RGB linear yang dikalikan
metalik float [0,1] Harus 0 atau 1
kekasaran float [0,1]
refleksi float [0,1] Pilih nilai > 0,35
clearCoat float [0,1] Harus 0 atau 1
clearCoatRoughness float [0,1] Memetakan ulang ke [0..0.6]
anisotropi float [-1,1] Anisotropi berada dalam arah yang jelas jika nilai ini positif
anisotropyDirection float3 [0,1] RGB linear, mengenkode vektor arah dalam ruang tangen
ambientOcclusion float [0,1]
normal float3 [0,1] RGB linear, mengenkode vektor arah dalam ruang tangen
clearCoatNormal float3 [0,1] RGB linear, mengenkode vektor arah dalam ruang tangen
mengembangkan float4 rgb=[0..1], a=[-n..n] Alfa adalah kompensasi eksposur

Warna dasar

Properti baseColor menentukan warna objek yang dirasakan (terkadang disebut albedo). Efek baseColor bergantung pada sifat permukaan, yang dikontrol oleh properti metallic yang dijelaskan dalam bagian Metallic.

Non-logam (dielektrik)

Menentukan warna difusi permukaan. Nilai dunia nyata biasanya ditemukan dalam rentang [10..240] jika nilai dienkode antara 0 dan 255, atau dalam rentang [0.04..0.94] antara 0 dan 1. Beberapa contoh warna dasar untuk permukaan non-logam dapat ditemukan dalam tabel di bawah.

Logam SRGB Heksadesimal Warna
Batubara 0,19, 0,19, 0,19 #323232
 
Karet 0,21, 0,21, 0,21 #353535
 
Lumpur 0,33, 0,24, 0,19 #553d31
 
Kayu 0,53, 0,36, 0,24 #875c3c
 
Vegetasi 0,48, 0,51, 0,31 #7b824e
 
Brick 0,58, 0,49, 0,46 #947d75
 
Pasir 0,69, 0,66, 0,52 #b1a884
 
Concrete 0,75, 0,75, 0,73 #c0bfbb
 
Logam (konduktor)

Menentukan warna spekuler permukaan. Nilai dunia nyata biasanya ditemukan dalam rentang [170..255] jika nilai dienkode antara 0 dan 255, atau dalam rentang [0.66..1.0] antara 0 dan 1. Beberapa contoh warna dasar untuk permukaan metalik dapat ditemukan pada tabel di bawah.

Logam SRGB Heksadesimal Warna
Silver 0,98, 0,98, 0,96 #faf9f5
 
Aluminium 0,96, 0,96, 0,96 #f4f5f5
 
Titanium 0,81, 0,78, 0,76 #cec8c2
 
Besi 0,76, 0,74, 0,73 #c0bdba
 
Platinum 0,84, 0,82, 0,79 #d6d1c8
 
Gold 1,00, 0,87, 0,62 #fedc9d
 
Kuningan 0,96, 0,89, 0,68 #f4e4ad
 
Tembaga 0,98, 0,85, 0,72 #fbd8b8
 

Metalik

Properti metallic menentukan apakah permukaannya adalah permukaan logam (konduktor) atau permukaan non-logam (dielektrik). Properti ini harus digunakan sebagai nilai biner, ditetapkan ke 0 atau 1. Nilai menengah hanya benar-benar berguna untuk membuat transisi antara berbagai jenis permukaan saat menggunakan tekstur.

Properti ini dapat mengubah tampilan permukaan secara dramatis. Permukaan non-logam memiliki pantulan difus kromatik dan refleksi spekuler akromatik (cahaya yang dipantulkan tidak berubah warna). Permukaan metalik tidak memiliki refleksi difusi dan refleksi spekuler kromatik (cahaya pantul mengambil warna permukaan seperti yang didefinisikan oleh baseColor).

Efek metallic ditampilkan di bawah ini (klik gambar untuk melihat versi yang lebih besar).

Kekasaran

Properti roughness mengontrol kelancaran permukaan yang dirasakan. Jika roughness disetel ke 0, permukaan akan sangat mulus dan sangat mengilap. Permukaan lebih kasar adalah, "quot;blurrier" refleksinya adalah. Properti ini sering disebut glossiness di mesin dan alat lain, dan kebalikan dari kekasaran (roughness = 1 - glossiness).

Non-logam

Efek roughness pada permukaan non-logam ditunjukkan di bawah ini (klik gambar untuk melihat versi yang lebih besar).

Logam

Efek roughness pada permukaan metalik ditampilkan di bawah ini (klik gambar untuk melihat versi yang lebih besar).

Refleksi

Properti reflectance hanya memengaruhi permukaan non-logam. Properti ini dapat digunakan untuk mengontrol intensitas spekuler. Nilai ini ditentukan antara 0 dan 1 dan mewakili pemetaan ulang persentase pantul. Misalnya, nilai default 0,5 sesuai dengan pantulan 4%. Nilai di bawah 0,35 (2% refleksi) harus dihindari karena tidak ada material dunia nyata yang memiliki refleksi rendah tersebut.

Efek reflectance pada permukaan non-logam ditampilkan di bawah ini (klik gambar untuk melihat versi yang lebih besar).

Grafik di bawah menunjukkan nilai umum dan hubungannya dengan fungsi pemetaan.

Tabel di bawah ini menjelaskan nilai pantulan yang dapat diterima untuk berbagai jenis bahan (tidak ada materi dunia nyata yang memiliki nilai di bawah 2%).

Material Refleksi Nilai properti
Perairan 2% 0.35
Kain 4% hingga 5,6% 0,5 hingga 0,59
Cairan umum 2% hingga 4% 0,35 hingga 0,5
Batu permata umum 5% hingga 16% 0,56 hingga 1,0
Plastik, kaca 4% hingga 5% 0,5 hingga 0,56
Bahan dielektrik lainnya 2% hingga 5% 0,35 hingga 0,56
Mata 2,5% 0,39
Skin 2,8% 0,42
Rambut 4,6% 0,54
Gigi 5,8% 0,6
Nilai default 4% 0,5

Hapus mantel

Material multi-lapisan cukup umum, terutama bahan dengan lapisan transparan tipis di atas lapisan dasar. Contoh nyata bahan tersebut mencakup cat mobil, kaleng soda, kayu berpernis, dan akrilik.

Properti clearCoat dapat digunakan untuk mendeskripsikan material dengan dua lapisan. Lapisan lapisan transparan akan selalu isotropik dan dielektrik. Gambar berikut membandingkan bahan serat karbon dalam model bahan standar (kiri) dan model lapisan bening (kanan).

Properti clearCoat mengontrol kekuatan lapisan lapisan bening. Ini harus diperlakukan sebagai nilai biner, ditetapkan ke 0 atau 1. Nilai menengah berguna untuk mengontrol transisi antara bagian-bagian permukaan yang memiliki lapisan lapisan yang jelas dan bagian yang tidak memiliki lapisan.

Efek clearCoat pada logam kasar ditunjukkan di bawah ini (klik gambar untuk melihat versi yang lebih besar).

Hapus kekasaran mantel

Properti clearCoatRoughness mirip dengan properti roughness, tetapi hanya berlaku untuk lapisan pelapis yang jelas. Selain itu, karena lapisan lapisan yang jelas tidak pernah kasar sepenuhnya, nilai antara 0 dan 1 dipetakan secara internal ke kekasaran sebenarnya dari 0 hingga 0,6.

Efek clearCoatRoughness pada logam kasar ditunjukkan di bawah ini (klik gambar untuk melihat versi yang lebih besar).

Anisotropi

Banyak material di dunia nyata, seperti logam kuas, hanya dapat direplikasi menggunakan model reflektansi anisotropik. Material dapat diubah dari model isotropik default menjadi model anisotropik dengan menggunakan properti anisotropy. Gambar berikut membandingkan bahan isotropik (kiri) dan bahan anistropik (kanan).

Efek dari variasi anisotropy dari 0,0 (kiri) hingga 1,0 (kanan) pada logam kasar ditampilkan di bawah (klik gambar untuk melihat versi yang lebih besar).

Gambar di bawah menunjukkan bagaimana arah sorotan anisotropik dapat dikontrol dengan menggunakan nilai positif atau negatif: nilai positif (kiri) menentukan anisotropi dalam arah tangen dan nilai negatif (kanan) dalam arah bitangen.

Arah anisotropi

Properti anisotropyDirection menentukan arah permukaan di titik tertentu dan dengan demikian mengontrol bentuk sorotan spekuler. Ini ditentukan sebagai vektor dari 3 nilai yang biasanya berasal dari tekstur, yang mengenkode arah lokal ke permukaan.

Efek rendering anisotropyDirection pada logam dengan peta arah ditampilkan di bawah ini (klik gambar untuk melihat versi yang lebih besar).

Peta arah yang digunakan untuk merender gambar di atas ditampilkan di bawah.

Oklusi ambien

Properti ambientOcclusion menentukan seberapa banyak cahaya sekitar yang dapat diakses oleh titik permukaan. Ini adalah faktor bayangan per piksel antara 0,0 (bayangan penuh) dan 1,0 (penuh terang). Properti ini hanya memengaruhi pencahayaan tidak langsung difusi (pencahayaan berbasis gambar), bukan cahaya langsung seperti arah, titik dan lampu sorot, atau pencahayaan spekuler. Gambar berikut membandingkan bahan tanpa oklusi ambien yang menyebar (kiri) dan dengan oklusi ambien (kiri).

Normal

Properti normal menentukan normal permukaan pada titik tertentu. Teks ini biasanya berasal dari tekstur peta normal yang memungkinkan properti properti per piksel. Normal diberikan dalam ruang tangen, yang berarti +Z titik di luar permukaan.

Misalnya, bayangkan kita ingin merender furnitur yang dilapisi kulit berlapis. Pemodelan geometri untuk merepresentasikan pola berumbai secara akurat akan membutuhkan terlalu banyak segitiga sehingga kita harus memasukkan mesh poli tinggi ke dalam peta normal. Kemudian, Anda dapat menerapkan peta dasar ke mesh yang disederhanakan. Gambar berikut membandingkan mesh sederhana tanpa pemetaan normal (kiri) dan dengan mesh (kanan).

Perhatikan bahwa properti normal memengaruhi lapisan dasar, bukan lapisan yang jelas.

Hapus mantel normal

Properti clearCoatNormal menentukan batas normal lapisan lapisan kosong pada titik tertentu. Perilaku sebaliknya seperti properti normal.

Terang

Properti emissive dapat digunakan untuk menyimulasikan cahaya tambahan yang dikeluarkan oleh platform. Ini didefinisikan sebagai nilai float4 yang berisi warna RGB (dalam ruang linear) serta nilai kompensasi eksposur (dalam saluran alfa).

Meskipun nilai eksposur sebenarnya menunjukkan kombinasi setelan kamera, nilai ini sering digunakan oleh fotografer untuk menjelaskan intensitas cahaya. Oleh itu, kamera memungkinkan fotografer menerapkan kompensasi eksposur untuk membuat gambar terlihat berlebih atau kurang. Setelan ini dapat digunakan untuk kontrol artistik, tetapi juga untuk mencapai eksposur yang tepat (misalnya, salju akan ditampilkan sebagai 18% abu-abu tengah).

Nilai exposure compensation dari properti emisis dapat digunakan untuk memaksa warna emisis menjadi lebih cerah (nilai positif) atau lebih gelap (nilai negatif) dari eksposur saat ini. Jika efek bloom diaktifkan, penggunaan kompensasi eksposur positif dapat memaksa permukaan untuk mekar.

Model kain

Semua model material yang dijelaskan sebelumnya dirancang untuk menyimulasikan permukaan padat, baik pada makro maupun pada tingkat mikro. Namun, pakaian dan kain sering kali terbuat dari benang yang terhubung secara longgar yang menyerap dan menyebarkan cahaya yang datang. Jika dibandingkan dengan permukaan yang keras, kain akan dicirikan oleh lobus spekuler yang lebih halus dengan tingkat jatuh yang besar dan adanya pencahayaan yang terputus-putus, yang disebabkan oleh hamburan maju/mundur. Beberapa kain juga menampilkan warna spekular dua warna (misalnya beludru).

Gambar berikut membandingkan kain denim yang dirender menggunakan model standar (kiri) dan model kain (kanan). Perhatikan bagaimana model bahan standar gagal menangkap tampilan sampel kain denim (kiri). Permukaannya terlihat kaku (hampir plastik), lebih mirip dengan terpal dibandingkan dengan pakaian. Hal ini juga menunjukkan seberapa penting lobus specular yang lebih lembut yang disebabkan oleh penyerapan dan hamburan terhadap rekreasi kain yang setia.

Velvet adalah kasus penggunaan yang menarik untuk model bahan kain. Seperti yang ditunjukkan pada gambar di bawah, jenis kain ini menunjukkan pencahayaan tepi yang kuat karena hamburan maju dan mundur. Peristiwa sebar ini disebabkan oleh serat yang berdiri lurus di permukaan kain. Jika cahaya insiden berasal dari arah yang berlawanan dengan arah tampilan, serat akan meneruskan cahaya. Demikian pula, ketika insiden cahaya dari arah yang sama dengan arah tampilan, serat akan menyebarkan cahaya ke belakang.

Penting untuk diperhatikan bahwa ada jenis kain yang masih dimodelkan dengan paling baik berdasarkan model bahan permukaan keras. Misalnya, kulit, sutra, dan satin dapat dibuat ulang menggunakan model bahan standar atau anisotropik.

Model bahan kain mencakup semua parameter yang ditentukan sebelumnya untuk mode bahan standar, kecuali metalik dan pantul. Dua parameter tambahan yang dijelaskan dalam tabel di bawah juga tersedia.

Parameter Definisi
sheenColor Tinta spekuler untuk membuat kain spekular dua warna (defaultnya adalah \(\sqrt{baseColor}\))
subsurfaceColor Warna untuk warna difusi setelah sebar dan penyerapan

Jenis dan rentang setiap properti dijelaskan dalam tabel di bawah.

Properti Jenis Rentang Catatan
sheenColor float3 [0,1] RGB Linear
subsurfaceColor float3 [0,1] RGB Linear

Untuk membuat bahan mirip beludru, warna dasar dapat disetel ke hitam (atau warna gelap). Sebagai gantinya, informasi kromatisitas harus ditetapkan pada warna kemilau. Untuk membuat kain yang lebih umum seperti denim, katun, dll., gunakan warna dasar untuk kromatik dan gunakan warna kilau default atau setel warna kemilau ke luminan warna dasar.

Warna kilau

Properti sheenColor dapat digunakan untuk langsung mengubah pantulan spekuler. Hal ini menawarkan kontrol yang lebih baik terhadap tampilan kain dan memberikan kemampuan untuk membuat bahan spekuler dua warna.

Gambar berikut membandingkan kain biru dengan dan tanpa (kiri) dan dengan kemiringan (kanan) (klik gambar untuk melihat versi yang lebih besar).

Warna bawah permukaan

Properti subsurfaceColor tidak berbasis fisik dan dapat digunakan untuk menyimulasikan hamburan, penyerapan parsial, dan pancaran cahaya dalam jenis kain tertentu. Hal ini sangat berguna untuk membuat kain yang lebih lembut.

Gambar berikut menunjukkan efek subsurfaceColor. Ini menunjukkan kain putih (kolom kiri) vs kain putih dengan garis bawah permukaan cokelat (kolom kanan). Klik gambar untuk melihat versi yang lebih besar.

Model tidak terang

Model material yang tidak menyala dapat digunakan untuk menonaktifkan semua komputasi pencahayaan. Tujuan utamanya adalah merender elemen yang telah diberi pencahayaan awal seperti cubemap, konten eksternal (seperti streaming video atau kamera), antarmuka pengguna, visualisasi/proses debug, dll. Model yang tidak menyala hanya memperlihatkan dua properti yang dijelaskan dalam tabel di bawah ini.

Properti Definisi
baseColor Warna difusi permukaan
mengembangkan Warna difusi tambahan untuk menyimulasikan permukaan yang memancarkan. Properti ini sebagian besar berguna dalam pipeline HDR dengan tiket bunga

Jenis dan rentang setiap properti dijelaskan dalam tabel di bawah.

Properti Jenis Rentang Catatan
baseColor float4 [0,1] RGB linear yang dikalikan
mengembangkan float4 rgb=[0..1], a=T/A RGB linear yang dikalikan sebelumnya, alfa diabaikan

Nilai emissive hanya ditambahkan ke baseColor saat ada. Penggunaan utama emissive adalah memaksa permukaan yang tidak menyala agar mekar jika pipeline HDR dikonfigurasi dengan bloom pass.

Gambar berikut menunjukkan contoh model material tidak terang yang digunakan untuk merender informasi debug (klik gambar untuk melihat versi yang lebih besar).

Menangani warna

Warna linear

Jika data warna berasal dari tekstur, pastikan Anda menggunakan tekstur sRGB untuk mendapatkan manfaat dari konversi hardware otomatis dari sRGB ke linear. Jika data warna diteruskan sebagai parameter ke material, Anda dapat mengonversi dari sRGB ke linear dengan menjalankan algoritme berikut pada setiap saluran warna:

float sRGB_to_linear(float color) {
    return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
}

Atau, Anda dapat menggunakan salah satu dari dua versi yang lebih murah namun kurang akurat seperti yang ditunjukkan di bawah ini:

// Cheaper
linearColor = pow(color, 2.2);
// Cheapest
linearColor = color * color;

Alfa yang dikalikan

Warna menggunakan alfa yang dikalikan dengan komponen RGB-nya dikalikan dengan saluran alfa:

// Compute pre-multiplied color
color.rgb *= color.a;

Jika warna diambil dari tekstur, Anda dapat memastikan bahwa data tekstur telah dikalikan sebelumnya. Di Android, tekstur apa pun yang diupload dari Bitmap akan diperbanyak secara default.