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 adalahlit
. - 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
dantype
, keduanya, dari jenisstring
. 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 adalahfloat
) danprecision
(default-nya adalahdefault
). Formatnya bisa berupa salah satu dariint
,float
. Presisinya bisa berupa salah satu daridefault
(presisi terbaik untuk platform, biasanyahigh
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
.
- Jenis sampler: gunakan nama parameter yang diawali dengan
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. Atributtangents
secara otomatis diperlukan saat memilih model bayangan apa pun yang bukanunlit
. 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 bernamaeyeDirection
, Anda dapat mengaksesnya di shader fragmen menggunakanvariable_eyeDirection
. Dalam shader vertex, nama interpolant hanya merupakan anggota strukturMaterialVertexInputs
(material.eyeDirection
dalam contoh Anda). Setiap interpolan adalah jenisfloat4
(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 adalahopaque
. - 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 modetransparent
, 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 adalahobject
. - 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 adalahsmooth
. - 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 keflat
, 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 adalahback
. - 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
ataufalse
. Default-nya adalahtrue
.- Deskripsi
- Mengaktifkan atau menonaktifkan penulisan ke buffer warna.
material {
colorWrite : false
}
DepthWrite
- Jenis
boolean
- Nilai
true
ataufalse
. Default-nya adalahtrue
.- Deskripsi
- Mengaktifkan atau menonaktifkan penulisan ke buffer kedalaman.
material {
depthWrite : false
}
KedalamanCulling
- Jenis
boolean
- Nilai
true
ataufalse
. Default-nya adalahtrue
.- 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
ataufalse
. Default-nya adalahfalse
.- Deskripsi
- Mengaktifkan atau menonaktifkan rendering dua sisi. Jika ditetapkan ke
true
,culling
akan otomatis disetel kenone
. 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
, atautwoPassesTwoSides
. Nilai defaultnya adalahdefault
. - Deskripsi
- Mengontrol cara objek transparan dirender. Ini hanya valid jika mode
blending
bukanopaque
. 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 modeculling
, dll.twoPassesOneSide
: objek transparan dirender pertama dalam buffer kedalaman, lalu diikuti lagi dalam buffer warna, untuk mematuhi modecullling
. 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 dengandoubleSided
untuk menghasilkan efek yang lebih baik.
material {
transparency : twoPassesOneSide
}
maskThreshold
- Jenis
number
- Nilai
- Nilai antara
0.0
dan1.0
. Default-nya adalah0.4
. - Deskripsi
- Menetapkan nilai alfa minimum yang harus dihapus oleh fragmen jika mode
blending
ditetapkan kemasked
. Jika mode penggabungan bukanmasked
, 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
ataufalse
. Default-nya adalahfalse
.- 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
, atauskinning
. - 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 materialunlit
. 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.