Sceneform ให้คําจํากัดความเนื้อหาเริ่มต้น (.sfm
) เพื่อให้นักพัฒนาซอฟต์แวร์ได้รับผลลัพธ์ที่ยอดเยี่ยมได้อย่างง่ายดาย นักพัฒนาซอฟต์แวร์ที่ต้องการปรับแต่งรูปลักษณ์ของเนื้อหาอย่างละเอียดสามารถสร้างคําจํากัดความของเนื้อหาของตัวเอง (*.mat
ไฟล์) และนําไปใช้กับเนื้อหาได้โดยการระบุแอตทริบิวต์ source
ในคําจํากัดความเนื้อหา
แนวคิดหลัก
- เนื้อหา
- วัสดุเป็นตัวกําหนดลักษณะภายนอกของพื้นผิว ในการอธิบายและแสดงผลพื้นผิวอย่างสมบูรณ์ วัสดุจะให้ข้อมูลต่อไปนี้
- รุ่นของวัสดุ
- ชุดพารามิเตอร์ที่มีชื่อที่ควบคุมได้
- สถานะแรสเตอร์ (โหมดผสมผสาน การหักลบหลังใบหน้า เป็นต้น)
- โค้ดตัวปรับ Vertex
- โค้ดเฉดสีสําหรับส่วนย่อย
- รุ่นของวัสดุ
- เรียกอีกอย่างว่ารูปแบบการแรเงาหรือรูปแบบแสง ซึ่งเป็นโมเดลที่กําหนดลักษณะภายในของพื้นผิว คุณสมบัติเหล่านี้ได้รับอิทธิพลโดยตรงต่อวิธีการคํานวณแสง รวมถึงลักษณะของพื้นผิว
- คําจํากัดความของเนื้อหา
- ไฟล์ข้อความที่อธิบายถึงข้อมูลทั้งหมดที่เอกสารต้องการ หน้านี้อธิบายโครงสร้างและรูปแบบของไฟล์ (
*.mat
) Material Material
คําจํากัดความของเนื้อหา
คําจํากัดความของเนื้อหาคือไฟล์ข้อความที่อธิบายข้อมูลทั้งหมดที่เอกสารต้องการ
- ชื่อ
- พารามิเตอร์ผู้ใช้
- รุ่นของวัสดุ
- แอตทริบิวต์ที่จำเป็น
- การโต้ตอบ (เรียกว่าตัวแปร)
- สถานะแรสเตอร์ (โหมดผสมผสาน ฯลฯ)
- โค้ดเฉดสี (ตัวปรับแสงเงาสําหรับเฉดสี (ไม่บังคับ)
รูปแบบ
รูปแบบ "คําจํากัดความวัสดุ" เป็นรูปแบบแบบหลวมโดยอิงตามJSON ซึ่งเราเรียกว่า JSONish ในระดับบนสุด คําจํากัดความของเนื้อหาประกอบด้วยบล็อก 3 ประเภทที่ใช้สัญลักษณ์ออบเจ็กต์ JSON ดังนี้
material {
// material properties
}
vertex {
// vertex shader, optional
}
fragment {
// fragment shader
}
การกําหนดวัสดุขั้นต่ําที่ใช้งานได้ต้องมีทั้งบล็อก material
และ fragment
คุณเลือกที่จะบล็อก vertex
หรือไม่ก็ได้
ความแตกต่างกับ JSON
ใน JSON ออบเจ็กต์สร้างขึ้นจากคู่คีย์คีย์/ค่า คู่ JSON มีไวยากรณ์ต่อไปนี้
"key" : value
โดยที่ค่าอาจเป็นสตริง ตัวเลข ออบเจ็กต์ อาร์เรย์ หรือสัญพจน์ (true
, false
หรือ null
) ได้ แม้ว่าไวยากรณ์นี้จะถูกต้องอย่างสมบูรณ์แบบในคําจํากัดความที่เป็นเนื้อหา แต่ก็สามารถใช้รูปแบบที่ไม่มีเครื่องหมายคําพูดรอบสตริงใน JSONish ได้เช่นกัน
key : value
ใบเสนอราคาจะยังเป็นข้อมูลที่จําเป็นเมื่อสตริงมีการเว้นวรรค
บล็อก vertex
และ fragment
มีโค้ด GLSL ที่ยังไม่ได้ใช้และไม่ใช้ Escape ซึ่งใช้ไม่ได้กับ JSON
อนุญาตให้แสดงความคิดเห็นสไตล์ C++ บรรทัดเดียว
คีย์คู่คีย์จะคํานึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
ค่าของคู่จะไม่คํานึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่
ตัวอย่าง
รายการโค้ดต่อไปนี้แสดงตัวอย่างคําจํากัดความของเนื้อหาที่ถูกต้อง คําจํากัดความนี้ใช้โมเดลเนื้อหาแบบสว่าง ใช้โหมดการรวมที่ทึบแสงเริ่มต้น ซึ่งกําหนดให้ชุดพิกัด UV แสดงใน Mesh ที่แสดงผลและกําหนดพารามิเตอร์ผู้ใช้ 3 รายการ ส่วนต่อไปนี้ของเอกสารนี้อธิบายการบล็อก material
และ fragment
โดยละเอียด
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;
}
}
บล็อกวัสดุ
บล็อกเนื้อหาคือบล็อกที่จําเป็นซึ่งมีรายการคู่พร็อพเพอร์ตี้เพื่ออธิบายข้อมูลที่ไม่ต้องการเป็นเฉดสีทั้งหมด
name
- ประเภท
string
- ค่า
- สตริงใดก็ได้ ต้องมีเครื่องหมายคําพูดคู่หากชื่อมีการเว้นวรรค
- คำอธิบาย
- ตั้งชื่อเนื้อหา ชื่อจะคงอยู่ในช่วงรันไทม์เพื่อ การแก้ไขข้อบกพร่อง
material {
name : stone
}
material {
name : "Wet pavement"
}
shadingModel
- ประเภท
string
- ค่า
lit
,cloth
,unlit
ค่าเริ่มต้นคือlit
- คำอธิบาย
- เลือกรุ่น Material ตามที่อธิบายไว้ในส่วนรุ่นวัสดุ
material {
shadingModel : unlit
}
พารามิเตอร์
- ประเภท
- อาร์เรย์ของออบเจ็กต์พารามิเตอร์
- ค่า
แต่ละรายการคือออบเจ็กต์ที่มีพร็อพเพอร์ตี้
name
และtype
ทั้ง 2 ประเภทstring
ชื่อต้องเป็นตัวระบุ GLSL ที่ถูกต้อง ประเภทต้องเป็นหนึ่งในประเภทที่อธิบายไว้ในตารางด้านล่างประเภท คำอธิบาย บูลีน บูลีนเดี่ยว บูลีน2 เวกเตอร์ของบูลีน 2 บูลีน บูลีน3 เวกเตอร์ของบูลีน 3 บูลีน บูลีน4 เวกเตอร์ของบูลีน 4 บูลีน จำนวนลอยตัว ทศนิยมเดี่ยว ทศนิยม 2 เวกเตอร์ของเลขทศนิยม 2 ชุด ทศนิยม 3 เวกเตอร์ของจุดลอยตัว 3 จุด ทศนิยม 4 เวกเตอร์ของเลขทศนิยม 4 ชุด int จํานวนเต็มเดี่ยว int2 เวกเตอร์ของจํานวนเต็ม 2 ค่า int3 เวกเตอร์จํานวนเต็ม 3 ตัว int4 เวกเตอร์ของเลขจํานวนเต็ม 4 ตัว ตัวอย่าง 2d พื้นผิว 2 มิติ ตัวอย่างภายนอก พื้นผิวภายนอก ดูข้อมูลเพิ่มเติมได้ที่ ExternalTexture และ setExternalTexture() - แซมเพลอร์
ประเภทตัวอย่างยังระบุ
format
(ค่าเริ่มต้นเป็นfloat
) และprecision
ได้ด้วย (ค่าเริ่มต้นเป็นdefault
) รูปแบบอาจเป็นint
หรือfloat
ก็ได้ ความแม่นยําอาจเป็นค่าใดค่าหนึ่งของdefault
(ความแม่นยําที่ดีที่สุดสําหรับแพลตฟอร์ม โดยทั่วไปคือhigh
ในเดสก์ท็อปmedium
ในอุปกรณ์เคลื่อนที่)low
,medium
,high
- คำอธิบาย
แสดงพารามิเตอร์ที่เนื้อหากําหนด พารามิเตอร์เหล่านี้สามารถตั้งค่าได้ที่รันไทม์โดยใช้ Sceneform' Material API การเข้าถึงพารามิเตอร์จากเฉดสีจะแตกต่างกันไปตามประเภทของพารามิเตอร์
- ประเภทตัวอย่าง: ใช้ชื่อพารามิเตอร์ที่ขึ้นต้นด้วย
materialParams_
เช่นmaterialParams_myTexture
- ประเภทอื่นๆ: ใช้ชื่อพารามิเตอร์เป็นช่องของโครงสร้างที่เรียกว่า
materialParams
เช่น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;
}
}
ต้องใช้
- ประเภท
- อาร์เรย์ของ
string
- ค่า
- แต่ละรายการต้องเป็น
uv0
,uv1
,color
และtangents
- คำอธิบาย
- แสดงรายการแอตทริบิวต์จุดยอดมุมที่วัสดุต้องใช้ ระบบจะรวมแอตทริบิวต์
position
ไว้โดยอัตโนมัติและไม่จําเป็นต้องระบุ ต้องระบุแอตทริบิวต์tangents
โดยอัตโนมัติเมื่อเลือกรูปแบบการแรเงาที่ไม่ใช่unlit
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีเข้าถึงแอตทริบิวต์เหล่านี้จากตัวปรับแสงเงาได้จากส่วนเงาของเอกสารนี้
material {
parameters : [
{
type : sampler2d,
name : texture
},
],
requires : [
uv0
],
shadingModel : lit,
}
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
material.baseColor = texture(materialParams_texture, getUV0());
}
}
ตัวแปร
- ประเภท
- อาร์เรย์ของ
string
- ค่า
- สูงสุด 4 สตริง โดยแต่ละสตริงต้องเป็นตัวระบุ GLSL ที่ถูกต้อง
- คำอธิบาย
- กําหนดจํานวนการโต้ตอบที่กําหนดเอง (หรือตัวแปร) ที่เอาต์พุตด้วยตัวปรับสีเงาของวัสดุ ##99 แต่ละรายการในอาร์เรย์นี้จะกําหนดชื่อที่เกี่ยวข้อง
ชื่อเต็มในตัวปรับเฉดสีคือชื่อของส่วนที่เกี่ยวข้องซึ่งมีคํานําหน้า
variable_
ตัวอย่างเช่น หากคุณประกาศตัวแปรชื่อeyeDirection
คุณสามารถเข้าถึงตัวแปรได้ที่ตัวปรับเงาส่วนย่อยโดยใช้variable_eyeDirection
ในหน้าต่างตัวจุดยอด ชื่อส่วนที่แทรกอยู่จะตอบโจทย์ของโครงสร้างMaterialVertexInputs
เท่านั้น (material.eyeDirection
ในตัวอย่าง) สารละลายแต่ละอย่างเป็นประเภทfloat4
(vec4
) ในเฉดสี
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);
}
}
กลมกลืน
- ประเภท
string
- ค่า
opaque
,transparent
,fade
,add
,masked
ค่าเริ่มต้นคือopaque
- คำอธิบาย
กําหนดวิธี/หากออบเจ็กต์ที่แสดงผลถูกผสมผสานกับเนื้อหาของเป้าหมายการแสดงผล โหมดผสมผสานที่ใช้ได้มีดังนี้
- ทึบ: ปิดใช้การรวม และระบบจะไม่สนใจแชแนลอัลฟ่าของเอาต์พุต Material
- โปร่งใส: เปิดใช้การรวม เอาต์พุต Material ประกอบไปด้วยชิ้นส่วนเป้าหมายในเวอร์ชันอัลฟ่าโดยใช้กฎแหล่งที่มามากกว่าของ Porter-Duff' โหมดผสมผสานนี้จะถือว่ามีการคูณอัลฟ่าแบบทวีคูณ
- จางลง: ทําหน้าที่เป็น
transparent
แต่ความโปร่งใสจะมีผลกับแสงสะท้อน ในโหมดtransparent
ค่าอัลฟ่าของวัสดุ จะมีผลกับการจัดแสงแบบกระจายแสงเท่านั้น โหมดการผสมนี้ช่วยให้การไล่เฉดสีเข้าหรือออก - เพิ่ม: เปิดใช้การผสานอยู่ เอาต์พุตของเนื้อหาจะเพิ่มลงในเนื้อหาของเป้าหมายการแสดงผล
- มาสก์: ปิดใช้การผสานอยู่ โหมดผสมผสานนี้ช่วยให้ การมาสก์อัลฟ่า ช่องอัลฟ่าของเอาต์พุตเนื้อหา' กําหนดว่าจะทิ้งส่วนย่อยหรือไม่ ดูข้อมูลเพิ่มเติมได้ที่ส่วน maskThreshold
material {
blending : transparent
}
โดเมนจุดยอด
- ประเภท
string
- ค่า
object
,world
,view
และdevice
ค่าเริ่มต้นคือobject
- คำอธิบาย
กําหนดโดเมน (หรือพื้นที่พิกัด) ของ Mesh ที่แสดงผล โดเมนจะส่งผลต่อการเปลี่ยนจุดยอดในเฉดสีเวอร์ชันจุดยอด โดเมนที่เป็นไปได้มีดังนี้
- วัตถุ: จุดยอดต่างๆ กําหนดในพื้นที่พิกัด (หรือโมเดล) ของวัตถุ จุดยอดจะถูกเปลี่ยนรูปแบบโดยใช้เมทริกซ์การแปลงของออบเจ็กต์ที่แสดงผล
- โลก: จุดยอดต่างๆ จะอยู่ในพื้นที่พิกัดของโลก จุดยอดต่างๆ จะไม่ถูกแปลงโดยใช้การแปลงของออบเจ็กต์ที่แสดงผล
- มุมมอง: จุดยอดต่างๆ ได้รับการกําหนดอยู่ในพื้นที่พิกัด (หรือดวงตาหรือกล้อง) จุดยอดต่างๆ จะไม่ถูกเปลี่ยนรูปแบบโดยใช้ออบเจ็กต์ที่แสดงผล
- อุปกรณ์: จุดยอดต่างๆ จะอยู่ในพื้นที่พิกัดของอุปกรณ์ (หรือคลิป) มาตรฐาน จุดยอดจะไม่ถูกแปลงโดยใช้การแปลงของออบเจ็กต์ที่แสดงผล
material {
vertexDomain : device
}
การประมาณค่า
- ประเภท
string
- ค่า
smooth
ที่flat
ค่าเริ่มต้นคือsmooth
- คำอธิบาย
- กําหนดวิธีประมาณค่าระหว่างตัวแปร (หรือตัวแปร) ระหว่างจุดยอด
เมื่อตั้งค่าพร็อพเพอร์ตี้นี้เป็น
smooth
ระบบจะทําการประมาณค่า การดูให้ถูกต้อง เมื่อตั้งค่าเป็นflat
จะไม่มีการประมาณค่าใดๆ ระหว่างคํา และส่วนย่อยทั้งหมดภายในสามเหลี่ยมที่ระบุจะกลายเป็นเฉดสีเหมือนกัน
material {
interpolation : flat
}
Culling
- ประเภท
string
- ค่า
none
,front
,back
และfrontAndBack
ค่าเริ่มต้นคือback
- คำอธิบาย
- กําหนดว่ารูปสามเหลี่ยมที่จะคัดออก ได้แก่ ไม่มี รูปสามเหลี่ยมด้านหน้า รูปสามเหลี่ยมด้านหลัง หรือทั้งหมด
material {
culling : none
}
เขียนสี
- ประเภท
boolean
- ค่า
true
หรือfalse
ค่าเริ่มต้นคือtrue
- คำอธิบาย
- เปิดหรือปิดใช้การเขียนลงในบัฟเฟอร์สี
material {
colorWrite : false
}
ความลึกของการเขียน
- ประเภท
boolean
- ค่า
true
หรือfalse
ค่าเริ่มต้นคือtrue
- คำอธิบาย
- เปิดหรือปิดใช้การเขียนลงในบัฟเฟอร์ความลึก
material {
depthWrite : false
}
ความลึกของคลิป
- ประเภท
boolean
- ค่า
true
หรือfalse
ค่าเริ่มต้นคือtrue
- คำอธิบาย
- เปิดหรือปิดใช้การทดสอบความลึก เมื่อปิดใช้การทดสอบความลึก ออบเจ็กต์ที่แสดงผลด้วยเนื้อหานี้จะปรากฏเหนือออบเจ็กต์ที่ทึบแสงอื่นๆ เสมอ
material {
depthCulling : false
}
สองด้าน
- ประเภท
boolean
- ค่า
true
หรือfalse
ค่าเริ่มต้นคือfalse
- คำอธิบาย
- เปิดหรือปิดใช้การแสดงผล 2 ฝั่ง เมื่อตั้งค่าเป็น
true
ระบบจะตั้งค่าculling
เป็นnone
โดยอัตโนมัติ หากสามเหลี่ยมหันกลับมา สามเหลี่ยมและปกติจะพลิกเป็นด้านหน้าโดยอัตโนมัติ
material {
doubleSided : true
}
ความโปร่งใส
- ประเภท
string
- ค่า
default
,twoPassesOneSide
หรือtwoPassesTwoSides
ค่าเริ่มต้นคือdefault
- คำอธิบาย
- ควบคุมการแสดงวัตถุโปร่งใส ใช้ได้เฉพาะเมื่อโหมด
blending
ไม่ใช่opaque
วิธีการเหล่านี้ก็แสดงผลเรขาคณิตของเว้าอย่างแม่นยําได้ไม่มาก แต่ในทางปฏิบัติก็มักจะดีพอ
โหมดความโปร่งใสที่เป็นไปได้มี 3 โหมดดังต่อไปนี้
default
: วัตถุโปร่งใสจะแสดงผลตามปกติ จะทํางานตามโหมดculling
ฯลฯtwoPassesOneSide
: ออบเจ็กต์โปร่งใสจะแสดงผลในบัฟเฟอร์ส่วนแรก จากนั้นตามด้วยบัฟเฟอร์สีอีกครั้งตามโหมดcullling
การดําเนินการนี้จะแสดงออบเจ็กต์โปร่งใสเพียงครึ่งหนึ่งดังที่แสดงด้านล่างtwoPassesTwoSides
: วัตถุโปร่งใสจะแสดงผล 2 ครั้งในบัฟเฟอร์สี กล่าวคือ แสดงที่ด้านหน้าด้านหลังและด้านหน้า โหมดนี้ช่วยให้คุณแสดงผลใบหน้าทั้ง 2 ชุดได้ในขณะที่ลดหรือจัดการกับปัญหาการจัดเรียงทิ้งดังที่แสดงด้านล่าง รวมtwoPassesTwoSides
กับdoubleSided
ได้เพื่อ ผลลัพธ์ที่ดีกว่า
material {
transparency : twoPassesOneSide
}
มาสก์หน้ากาก
- ประเภท
number
- ค่า
- ค่าระหว่าง
0.0
และ1.0
ค่าเริ่มต้นคือ0.4
- คำอธิบาย
- ตั้งค่าอัลฟ่าขั้นต่ําที่ส่วนย่อยต้องไม่ทิ้งเมื่อตั้งโหมด
blending
เป็นmasked
เมื่อโหมดผสมผสานไม่ใช่masked
ระบบจะไม่สนใจค่านี้ ค่านี้สามารถใช้เพื่อควบคุมลักษณะที่ปรากฏของออบเจ็กต์ที่มาสก์อัลฟ่า
material {
blending : masked,
maskThreshold : 0.5
}
ตัวคูณเงา
- ประเภท
boolean
- ค่า
true
หรือfalse
ค่าเริ่มต้นคือfalse
- คำอธิบาย
- ใช้ได้เฉพาะในรูปแบบเฉดสี
unlit
เท่านั้น หากเปิดใช้คุณสมบัตินี้ สีสุดท้ายที่คํานวณจากวัสดุจะคูณด้วยปัจจัยเงา (หรือระดับการมองเห็น) ซึ่งช่วยให้สามารถสร้างวัตถุรับเงาที่โปร่งใสได้ (เช่น เครื่องบินพื้นดินแบบมองไม่เห็นใน 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);
}
}
ตัวกรองตัวแปร
- ประเภท
- อาร์เรย์ของ
string
- ค่า
- แต่ละรายการต้องเป็น
dynamicLighting
,directionalLighting
,shadowReceiver
หรือskinning
- คำอธิบาย
- ใช้เพื่อระบุรายการตัวแปรเฉดสีที่แอปพลิเคชันรับประกันไว้ว่าไม่จําเป็น ระบบจะข้ามตัวแปรตัวปรับแสงเงาเหล่านี้ไปในระหว่างขั้นตอนการสร้างโค้ด ซึ่งจะทําให้ขนาดโดยรวมของวัสดุลดลง โปรดทราบว่ารายละเอียดปลีกย่อยบางอย่างอาจถูกกรองออกโดยอัตโนมัติ เช่น รายละเอียดปลีกย่อยที่เกี่ยวข้องกับแสงทั้งหมด (เช่น
directionalLighting
) จะถูกกรองออกเมื่อรวบรวมวัสดุunlit
โปรดใช้ตัวกรองตัวแปรด้วยความระมัดระวัง การกรองตัวแปรที่จําเป็นในระหว่างรันไทม์อาจทําให้เกิดข้อขัดข้อง
คําอธิบายตัวแปร: - directionalLighting
ใช้เมื่อมีแสงทิศทางอยู่ในฉาก - dynamicLighting
ใช้เมื่อมีแสงที่ไม่ใช่ทิศทาง (จุด จุด ฯลฯ) อยู่ในฉาก - shadowReceiver
ใช้เมื่อวัตถุรับเงา - skinning
ใช้เมื่อวัตถุเคลื่อนไหวโดยใช้สกินของ GPU
material {
name : "Invisible shadow plane",
shadingModel : unlit,
shadowMultiplier : true,
blending : transparent,
variantFilter : [ skinning ]
}
บล็อก Vertex
คุณจะบล็อกบล็อกเวอร์เท็กซ์หรือไม่ก็ได้ เพื่อควบคุมการควบคุมเฉดสีของจุดยอด บล็อกเวอร์เท็กซ์ต้องมีรหัส ESSL 3.0 ที่ถูกต้อง (เวอร์ชันของ GLSL ที่สนับสนุนใน OpenGL ES 3.0) คุณสามารถสร้างฟังก์ชันหลายรายการ
ภายในบล็อกจุดยอดได้ แต่ต้องประกาศฟังก์ชัน materialVertex
ดังนี้
vertex {
void materialVertex(inout MaterialVertexInputs material) {
// vertex shading code
}
}
ระบบจะเรียกใช้ฟังก์ชันนี้โดยอัตโนมัติขณะรันไทม์โดยระบบการลงสี และช่วยให้คุณอ่านและแก้ไขคุณสมบัติของเนื้อหาโดยใช้โครงสร้าง MaterialVertexInputs
ได้ ดูคําจํากัดความที่สมบูรณ์ของโครงสร้างนี้ได้ในส่วนอินพุตจุดยอดของ Material
คุณใช้โครงสร้างนี้ในการคํานวณตัวแปร/การโต้ตอบที่กําหนดเอง หรือเพื่อแก้ไขค่าของแอตทริบิวต์ได้ ตัวอย่างเช่น บล็อกจุดยอดต่อไปนี้จะแก้ไขทั้งสีและพิกัด UV ของจุดยอดในช่วงเวลาต่างๆ
material {
requires : [uv0, color]
}
vertex {
void materialVertex(inout MaterialVertexInputs material) {
material.color *= sin(getTime());
material.uv0 *= sin(frameUniforms.time);
}
}
นอกจากโครงสร้าง MaterialVertexInputs
แล้ว โค้ดเฉดสีเวอร์ชันจุดยอดสามารถใช้ API สาธารณะทั้งหมดที่แสดงในส่วน Shader Public API ได้
อินพุตจุดยอดของวัสดุ
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
};
บล็อกส่วนย่อย
ต้องใช้การบล็อก Fragment เพื่อควบคุมขั้นตอนการแรเงา Fragment ของวัสดุ บล็อกส่วนย่อยต้องมีโค้ด ESSL 3.0 ที่ถูกต้อง (เวอร์ชันของ GLSL ที่รองรับใน OpenGL ES 3.0) คุณสามารถสร้างฟังก์ชันหลายรายการ
ภายในบล็อกจุดยอดได้ แต่ต้องประกาศฟังก์ชัน material
ดังนี้
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
// fragment shading code
}
}
ระบบจะเรียกใช้ฟังก์ชันนี้โดยอัตโนมัติขณะรันไทม์โดยระบบการลงสี และช่วยให้คุณอ่านและแก้ไขคุณสมบัติของเนื้อหาโดยใช้โครงสร้าง MaterialInputs
ได้ คุณสามารถดูคําจํากัดความทั้งหมดของโครงสร้างนี้ได้ในส่วนการป้อนข้อมูลของส่วนย่อยเนื้อหา ดูคําจํากัดความทั้งหมดของสมาชิกที่หลากหลายของโครงสร้างได้ในส่วนโมเดล Material ของเอกสารนี้
เป้าหมายของฟังก์ชัน material()
คือคํานวณคุณสมบัติวัสดุสําหรับโมเดลเฉดสีที่เลือกโดยเฉพาะ ตัวอย่างเช่น ต่อไปนี้คือบล็อกส่วนย่อยที่สร้างโลหะสีแดงสดโดยใช้โมเดลการแรเงาแบบมาตรฐาน
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;
}
}
ฟังก์ชัน กําลังเตรียมวัสดุ
โปรดทราบว่าคุณต้องเรียกใช้ prepareMaterial(material)
ก่อนออกจากฟังก์ชัน material()
ฟังก์ชัน prepareMaterial
นี้จะกําหนดสถานะภายในของโมเดลเนื้อหา สามารถเข้าถึง API บางรายการที่อธิบายไว้ในส่วน Fragment API เช่น shading_normal
ได้หลังจากที่เรียกใช้ prepareMaterial()
เท่านั้น
อย่าลืมว่าพร็อพเพอร์ตี้ normal
ตามที่อธิบายไว้ในส่วนอินพุตส่วนย่อยของเนื้อหาจะส่งผลกระทบเฉพาะเมื่อแก้ไขก่อนเรียก prepareMaterial()
เท่านั้น ต่อไปนี้คือตัวอย่างของตัวปรับแสงเงาเงาที่แก้ไขคุณสมบัติ normal
อย่างถูกต้อง เพื่อทําพลาสติกพลาสติกมันวาวพร้อมการแมปบัมพ์
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;
}
}
อินพุตส่วนย่อยของเนื้อหา
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)
}
ชาร์ด API สาธารณะ
ประเภท
แม้ว่าประเภท GLSL จะใช้ได้โดยตรง (vec4
หรือ mat4
) แต่เราขอแนะนําให้ใช้ชื่อแทนประเภทต่อไปนี้
ชื่อ | ประเภท GLSL | คำอธิบาย |
---|---|---|
บูลีน2 | Bvec2 | เวกเตอร์ของบูลีน 2 บูลีน |
บูลีน3 | Bvec3 | เวกเตอร์ของบูลีน 3 บูลีน |
บูลีน4 | Bvec4 | เวกเตอร์ของบูลีน 4 บูลีน |
int2 | ivec2 | เวกเตอร์จํานวนเต็ม 2 ตัว |
int3 | ivec3 | เวกเตอร์จํานวนเต็ม 3 ตัว |
int4 | ivec4 | เวกเตอร์จํานวนเต็ม 4 ตัว |
Uint2 | Uuvec2 | เวกเตอร์ของจํานวนเต็มที่ไม่มีเครื่องหมาย 2 ตัว |
Uint3 | Uec3 | เวกเตอร์จํานวนเต็มที่ไม่มีเครื่องหมาย 3 ตัว |
Uint4 | Uuv44 | เวกเตอร์จํานวนเต็ม 4 ตัวที่ไม่มีเครื่องหมาย |
ทศนิยม 2 | ทศนิยม 2 | เวกเตอร์ 2 ลอย |
ทศนิยม 3 | ทศนิยม 3 | เวกเตอร์ 3 ลอย |
ทศนิยม 4 | ทศนิยม 4 | เวกเตอร์โฟลต 4 ลูก |
ทศนิยม 4x4 | แผ่นรองที่ 4 | เมทริกซ์แบบลอยขนาด 4x4 |
ทศนิยม 3x3 | แผ่นรองที่ 3 | เมทริกซ์แบบลอยขนาด 3x3 |
คณิตศาสตร์
ชื่อ | ประเภท | คำอธิบาย |
---|---|---|
PI | จำนวนลอยตัว | ค่าคงที่ที่แสดงถึง \(\pi\) |
ครึ่งแรก | จำนวนลอยตัว | ค่าคงที่ที่แสดงถึง \(\frac{\pi}{2}\) |
สีอิ่มตัว(ทศนิยม x) | จำนวนลอยตัว | ยึดค่าที่ระบุระหว่าง 0.0 ถึง 1.0 |
pow5(ทศนิยม x) | จำนวนลอยตัว | คํานวณ \(x^5\) |
ตร.ก. (ทศนิยม x) | จำนวนลอยตัว | คํานวณ \(x^2\) |
สูงสุด 3(ทศนิยม 3) | จำนวนลอยตัว | แสดงค่าสูงสุดของ float3 ที่ระบุ |
mulMat4x4Float3(แบบลอย4x4, "ทศนิยม 3") | ทศนิยม 4 | การคืนสินค้า \(m * v\) |
mulMat3x3Float3(ทศนิยม 4x4 m, ทศนิยม v) | ทศนิยม 4 | การคืนสินค้า \(m * v\) |
เมทริกซ์
ชื่อ | ประเภท | คำอธิบาย |
---|---|---|
getViewFromWorldMatrix() | ทศนิยม 4 x 4 | เมทริกซ์ที่แปลงออกจากพื้นที่โลก เป็นมุมมอง/พื้นที่ตา |
getWorldFromViewMatrix() | ทศนิยม 4 x 4 | เมทริกซ์ที่แปลงจากพื้นที่แสดงผล/ดวงตาไปเป็นพื้นที่โลก |
getClipFromViewMatrix() | ทศนิยม 4 x 4 | เมทริกซ์ที่แปลงจากพื้นที่แสดงผล/ดวงตาไปเป็นพื้นที่คลิป (NDC) |
getViewFromClipMatrix() | ทศนิยม 4 x 4 | เมทริกซ์ที่แปลงจากพื้นที่คลิป (NDC) ไปเป็นพื้นที่มุมมอง/ดวงตา |
getClipFromWorldMatrix() | ทศนิยม 4 x 4 | เมทริกซ์ที่แปลงพื้นที่จากรอบโลก เป็น Clip (NDC) |
ค่าคงที่ของเฟรม
ชื่อ | ประเภท | คำอธิบาย |
---|---|---|
รับความละเอียด() | ทศนิยม 4 | ความละเอียดของข้อมูลพร็อพเพอร์ตี้ในหน่วยพิกเซล: width , height , 1 / width , 1 / height |
getWorldCameraPosition() | ทศนิยม 3 | ตําแหน่งของกล้อง/ดวงตาบนโลก |
getTime() | จำนวนลอยตัว | เวลาในหน่วยวินาทีตั้งแต่เริ่มต้นเครื่องมือ Sceneform และระบบอาจรีเซ็ตเป็นประจําเพื่อไม่ให้สูญเสียความแม่นยํา |
getExposure() | จำนวนลอยตัว | การรับแสงของกล้อง |
getEV100() | จำนวนลอยตัว | ค่าแสงที่ ISO 100 ของกล้อง |
Vertex เท่านั้น
API ต่อไปนี้มีให้ใช้งานเฉพาะจากบล็อกจุดยอดมุมเท่านั้น
ชื่อ | ประเภท | คำอธิบาย |
---|---|---|
ตําแหน่ง: | ทศนิยม 4 | ตําแหน่ง Vertex ในโดเมนที่กําหนดโดยวัสดุ (ค่าเริ่มต้น: วัตถุ/พื้นที่โมเดล) |
getWorldFromModelMatrix() | ทศนิยม 4 x 4 | เมทริกซ์ที่แปลงจากโมเดล (อ็อบเจกต์) ไปเป็นพื้นที่โลก |
getWorldFromModelNormalMatrix() | ทศนิยม 3x3 | เมทริกซ์ที่แปลงสิ่งปกติจากโมเดล (วัตถุ) ไปยังอวกาศ |
เฉพาะส่วนย่อยเท่านั้น
API ต่อไปนี้มีเฉพาะจากบล็อกส่วนย่อยเท่านั้น
ชื่อ | ประเภท | คำอธิบาย |
---|---|---|
getWorldTangentFrame() | ทศนิยม 3x3 | เมทริกซ์ภายในคอลัมน์ tangent (frame[0] )
bi-tangent (frame[1] ) และ
normal (frame[2] ) ของจุดยอด
ในพื้นที่โลก หากวัสดุไม่คํานวณพื้นที่แทนเจนต์ตามปกติสําหรับการแมปบัมพ์ หรือหากการแรเงาไม่ใช่แบบแอนไอโซทรอปิก จะมีเพียง normal เท่านั้นที่ถูกต้องในเมทริกซ์นี้ |
getWorldPosition() | ทศนิยม 3 | ตําแหน่งของส่วนย่อย บนพื้นที่โลก |
getWorldViewVector() | ทศนิยม 3 | เวกเตอร์มาตรฐานในโลกแห่งพื้นที่ จากตําแหน่งส่วนย่อยไปยังดวงตา |
getWorldNormalVector() | ทศนิยม 3 | การปรับค่ามาตรฐานแบบปกติในพื้นที่บนโลกหลังการจับคู่แบบบัมพ์ (ต้องใช้หลังจาก prepareMaterial() ) |
getWorldReflectedVector() | ทศนิยม 3 | การสะท้อนของเวกเตอร์มุมมองเกี่ยวกับปกติ (ต้องใช้หลังจาก prepareMaterial() ) |
getNdotV() | จำนวนลอยตัว | ผลลัพธ์ของ dot(normal,
view) สูงกว่า 0 เสมอ (ต้องใช้หลังจาก prepareMaterial() ) |
ดาวน์โหลดสี() | ทศนิยม 4 | สีของคําที่แทรก หากจําเป็นต้องระบุแอตทริบิวต์สี |
getUV0() | ทศนิยม 2 | ชุดพิกัด UV ที่แทรกไว้ก่อนชุดแรก หากต้องระบุแอตทริบิวต์ uv0 |
getUV1() | ทศนิยม 2 | ชุดพิกัด UV ที่แทรกไว้ก่อนชุดแรก หากต้องระบุแอตทริบิวต์ uv1 |
inverseTonemap(แบบลอย 3) | ทศนิยม 3 | ใช้โอเปอเรเตอร์การแมปโทนแบบผกผันกับสี RGB เชิงเส้นที่ระบุ การดําเนินการนี้อาจเป็นค่าประมาณ |
inverseTonemapSRGB(แบบลอย 3) | ทศนิยม 3 | ใช้โอเปอเรเตอร์การแมปโทนแบบผกผันกับสี sRGB ที่ระบุไม่ใช่แบบเชิงเส้น การดําเนินการนี้อาจเป็นค่าประมาณ |
ความสว่าง(ทศนิยม 3) | จำนวนลอยตัว | คํานวณความสว่างของสี sRGB เชิงเส้นที่ระบุ |
รุ่นของวัสดุ
วัสดุที่ใช้ทําฉากสามารถใช้รูปแบบใดรูปแบบหนึ่งต่อไปนี้
- ฉบับเล็ก (หรือมาตรฐาน)
- เสื้อผ้า
- ไม่มีไฟ
รุ่น Lit
แบบจําลองที่สว่างคือโมเดลวัสดุมาตรฐานของ Sceneform' รูปแบบการลงสีทางกายภาพนี้ออกแบบมาเพื่อรองรับการทํางานร่วมกันด้วยเครื่องมือและเครื่องมือทั่วไปอื่นๆ เช่น Unity 5, Unreal Engine 4, ผู้ควบคุมสาร หรือ Marmoset Toolbag
วัสดุประเภทนี้ใช้เพื่ออธิบายพื้นผิวที่ไม่ใช่โลหะ (dielectrics) หรือพื้นผิวโลหะได้จํานวนมาก (ตัวนํา)
ลักษณะของสื่อที่ใช้โมเดลมาตรฐานจะควบคุมได้โดยใช้พร็อพเพอร์ตี้ที่อธิบายไว้ในตารางด้านล่าง
คุณสมบัติของโมเดลมาตรฐาน
พร็อพเพอร์ตี้ | คำจำกัดความ |
---|---|
สีฐาน | กระจายไปยังพื้นที่สีที่ไม่ใช่โลหะและสีเฉพาะสําหรับพื้นผิวเมทัลลิก |
เมทัลลิก | พื้นผิวเป็นอิเล็กทริก (0.0) หรือตัวนํา (1.0) มักใช้เป็นค่าไบนารี (0 หรือ 1) |
ความหยาบ | ความลื่นไหลที่เห็นได้ (1.0) หรือความหยาบ (0.0) ของพื้นผิว พื้นผิวที่เรียบเนียนแสดงถึงแสงสะท้อนที่คมชัด |
เงาสะท้อน | การสะท้อนของภาพเฟลซีนที่เหตุการณ์ปกติสําหรับพื้นผิวที่เป็นกระแสไฟฟ้า ซึ่งจะช่วยควบคุมความแรงของเงาสะท้อน |
ล้างโค้ต | ความรัดกุมของชั้นเสื้อโค้ทที่ชัดเจน |
ความไม่ชัดเจนของความทึบแสง | รู้สึกถึงความนุ่มนวลหรือความหยาบกระด้างของเลเยอร์เสื้อโค้ทที่ชัดเจน |
แอนไอโซโทรปี | ปริมาณของสารไอโซทรอปินในเส้นสัมผัสหรือเส้นสัมผัส |
anisotropyDirection | ทิศทางของพื้นผิวในพื้นที่ |
การรวมเนื้อหาแบบแอมเบียนท์ | กําหนดสีของแสงแวดล้อมที่เข้าถึงได้จาก จุดพื้นผิว อัตราการแสดงผลเงาต่อพิกเซลระหว่าง 0.0 ถึง 1.0 |
ปกติ | รายละเอียดทั่วไปที่ใช้เพื่อหาพื้นผิวที่ใช้การแมปแบบแผ่น (การแมปปกติ) |
ล้างพิกัดปกติ | รายละเอียดทั่วไปที่ใช้เพื่อกําหนดเลเยอร์เสื้อโค้ทที่ชัดเจนโดยใช้การแมปบัมเปอร์ (การแมปปกติ) |
ใหญ่พิเศษ | มีแผ่น กระจายแสงอื่นๆ เพื่อจําลองพื้นผิวที่มีความชื้น (เช่น นีออน) คุณสมบัตินี้จะมีประโยชน์ในไปป์ไลน์ HDR ที่มี Bloom Pass |
ประเภทและช่วงของพร็อพเพอร์ตี้แต่ละรายการอธิบายไว้ในตารางด้านล่างนี้
พร็อพเพอร์ตี้ | ประเภท | ช่วง | หมายเหตุ |
---|---|---|---|
สีฐาน | ทศนิยม 4 | [0..1] | RGB เชิงเส้นที่คูณล่วงหน้า |
เมทัลลิก | จำนวนลอยตัว | [0..1] | ควรเป็น 0 หรือ 1 |
ความหยาบ | จำนวนลอยตัว | [0..1] | |
เงาสะท้อน | จำนวนลอยตัว | [0..1] | ต้องการใช้ค่า > 0.35 |
ล้างโค้ต | จำนวนลอยตัว | [0..1] | ควรเป็น 0 หรือ 1 |
ความไม่ชัดเจนของความทึบแสง | จำนวนลอยตัว | [0..1] | แมปใหม่กับ [0..0.6] |
แอนไอโซโทรปี | จำนวนลอยตัว | [-1..1] | แอนไอโซโทรปีอยู่ในทิศทางที่จับต้องได้ เมื่อค่านี้เป็นบวก |
anisotropyDirection | ทศนิยม 3 | [0..1] | RGB เชิงเส้นที่เข้ารหัสเวกเตอร์ทิศทาง ในพื้นที่แทนเจนต์ |
การรวมเนื้อหาแบบแอมเบียนท์ | จำนวนลอยตัว | [0..1] | |
ปกติ | ทศนิยม 3 | [0..1] | RGB เชิงเส้นที่เข้ารหัสเวกเตอร์ทิศทาง ในพื้นที่แทนเจนต์ |
ล้างพิกัดปกติ | ทศนิยม 3 | [0..1] | RGB เชิงเส้นที่เข้ารหัสเวกเตอร์ทิศทาง ในพื้นที่แทนเจนต์ |
ใหญ่พิเศษ | ทศนิยม 4 | rgb=[0..1], a=[-n..n] | อัลฟ่าคือค่าตอบแทน การรับแสง |
สีฐาน
พร็อพเพอร์ตี้ baseColor
กําหนดสีที่รับรู้ของออบเจ็กต์ (บางครั้งเรียกว่า Albedo) ผลกระทบของ baseColor
จะขึ้นอยู่กับลักษณะของพื้นผิว
ซึ่งควบคุมโดยพร็อพเพอร์ตี้ metallic
ตามที่อธิบายไว้ในส่วนเมทัลลิก
- ไม่ใช่โลหะ (ไดเลอิกติก)
กําหนดสีกระจายของพื้นผิว ค่าในชีวิตจริงมักจะอยู่ในช่วง [10..240] ถ้าค่าถูกเข้ารหัสระหว่าง 0 ถึง 255 หรือในช่วง [0.04..0.94] ระหว่าง 0 ถึง 1 ดูตัวอย่างของสีฐานสําหรับพื้นผิวที่ไม่ใช่โลหะในตารางด้านล่าง
เมทัล GBR เลขฐานสิบหก สี ถ่านหิน 0.19, 0.19, 0.19 #323232 ยาง 0.21, 0.21, 0.21 #353535 โคลน 0.33, 0.24, 0.19 #553d31 ไม้ 0.53, 0.36, 0.24 #875c3c พืชพันธุ์ 0.48, 0.51, 0.31 #7b824e อิฐ 0.58, 0.49, 0.46 #947d75 ทราย 0.69, 0.66, 0.52 #b1a884 คอนกรีต 0.75, 0.75, 0.73 #c0bfbb - โลหะ (วาทยากร)
กําหนดสีเฉพาะของพื้นผิว ค่าในชีวิตจริงมักจะอยู่ในช่วง [170..255] ถ้าค่าถูกเข้ารหัสระหว่าง 0 ถึง 255 หรือในช่วง [0.66..1.0] ระหว่าง 0 ถึง 1 ดูตัวอย่างของสีฐานสําหรับพื้นผิวโลหะได้จากตารางด้านล่าง
เมทัล GBR เลขฐานสิบหก สี สีเงิน 0.98, 0.98, 0.96 #faf9f5 อะลูมิเนียม 0.96, 0.96, 0.96 #f4f5f5 ไทเทเนียม 0.81, 0.78, 0.76 #cec8c2 เหล็ก 0.76, 0.74, 0.73 #c0bdba Platinum 0.84, 0.82, 0.79 #d6d1c8 Gold 1.00, 0.87, 0.62 #fedc9d ทองเหลือง 0.96, 0.89, 0.68 #f4e4ad ทองแดง 0.98, 0.85, 0.72 #fbd8b8
เมทัลลิก
คุณสมบัติ metallic
ระบุว่าพื้นผิวเป็นโลหะ (ตัวนํา) หรือพื้นผิวที่ไม่ใช่เมทัลลิก (ไดอิเล็กทริก) ควรใช้พร็อพเพอร์ตี้นี้เป็นค่าไบนารี ซึ่งกําหนดเป็น 0 หรือ 1 ค่ากลางมีประโยชน์มากจริงๆ ในการทําให้เกิดการเปลี่ยนระหว่างแพลตฟอร์มประเภทต่างๆ เมื่อใช้พื้นผิว
คุณสมบัตินี้สามารถเปลี่ยนรูปลักษณ์ของพื้นผิวได้อย่างมาก พื้นผิวที่ไม่ใช่เมทัลลิกมีแสงสะท้อนแบบช่วงสีและเงาสะท้อนแบบไล่สี
(แสงสะท้อนไม่เปลี่ยนสี) พื้นผิวเมทัลลิกไม่มีการสะท้อนแบบสะท้อน
และเงาสะท้อนของสีล่าสุด (แสงสะท้อนสะท้อนบนพื้นผิวของพื้นผิวตามที่กําหนดโดย baseColor
)
เอฟเฟกต์ metallic
แสดงอยู่ด้านล่าง (คลิกรูปภาพเพื่อดูเวอร์ชันที่ใหญ่กว่า)
ความหยาบ
คุณสมบัติ roughness
จะควบคุมความลื่นไหลของพื้นผิว เมื่อตั้ง roughness
เป็น 0 พื้นผิวจะเนียนเนียนและเงางามมาก ยิ่งพื้นผิวมีคุณภาพมากเท่าใด เงาสะท้อนก็จะยิ่งสะท้อนมากขึ้นเท่านั้น คุณสมบัตินี้มักจะเรียกว่าความมันวาวในเครื่องยนต์และเครื่องมืออื่นๆ และตรงกันข้ามกับความหยาบผิว (roughness = 1 - glossiness
)
ไม่ใช่โลหะ
เอฟเฟกต์ roughness
บนพื้นผิวที่ไม่ใช่โลหะจะแสดงด้านล่างนี้ (คลิกที่รูปภาพเพื่อดูขนาดใหญ่ขึ้น)
โลหะ
เอฟเฟกต์ roughness
บนพื้นผิวโลหะจะแสดงที่ด้านล่าง (คลิกรูปภาพเพื่อดูเวอร์ชันที่ใหญ่กว่า)
เงาสะท้อน
พร็อพเพอร์ตี้ reflectance
มีผลเฉพาะกับแพลตฟอร์มที่ไม่ใช่โลหะเท่านั้น พร็อพเพอร์ตี้นี้ใช้เพื่อควบคุมความเข้มของสเปกตรัมได้ ค่านี้กําหนดระหว่าง 0 ถึง 1 และแสดงถึงการแมปแสดงเปอร์เซ็นต์การสะท้อนกลับใหม่ เช่น ค่าเริ่มต้นเป็น 0.5 จะสอดคล้องกับการสะท้อน 4% ค่าที่ต่ํากว่า 0.35 (สะท้อน 2%)
ควรหลีกเลี่ยงเพราะวัสดุที่ใช้จริงไม่สะท้อนมากนัก
เอฟเฟกต์ reflectance
บนพื้นผิวที่ไม่ใช่โลหะจะแสดงด้านล่างนี้ (คลิกที่รูปภาพเพื่อดูขนาดใหญ่ขึ้น)
กราฟด้านล่างแสดงค่าทั่วไปและความเกี่ยวข้องกับฟังก์ชันการแมป
ตารางด้านล่างอธิบายถึงค่าการสะท้อนที่ยอมรับได้สําหรับวัสดุประเภทต่างๆ (ไม่มีเนื้อหาในโลกจริงที่มีค่าต่ํากว่า 2%)
เนื้อหา | เงาสะท้อน | ค่าของพร็อพเพอร์ตี้ |
---|---|---|
น้ำ | 2% | 0.35 |
ผ้า | 4% ถึง 5.6% | 0.5 ถึง 0.59 |
ของเหลวทั่วไป | 2% ถึง 4% | 0.35 ถึง 0.5 |
อัญมณีทั่วไป | 5% ถึง 16% | 0.56 ถึง 1.0 |
พลาสติก แก้ว | 4% ถึง 5% | 0.5 ถึง 0.56 |
วัสดุไฟฟ้าอื่นๆ | 2% ถึง 5% | 0.35 ถึง 0.56 |
ตา | 2.5% | 0.39 |
สีผิว | 2.8% | 0.42 |
ทำผม | 4.6% | 0.54 |
ฟัน | 5.8% | 0.6 |
ค่าเริ่มต้น | 4% | 0.5 |
ล้างเสื้อโค้ต
วัสดุหลายเลเยอร์พบได้ค่อนข้างบ่อย โดยเฉพาะวัสดุที่มีชั้นโปร่งแสงบางๆ เหนือชั้นฐาน ตัวอย่างจากวัสดุที่ใช้จริง เช่น สีรถยนต์ กระป๋องน้ําอัดลม ไม้เคลือบเงา และอะคริลิก
พร็อพเพอร์ตี้ clearCoat
ใช้อธิบายวัสดุที่มี 2 เลเยอร์ได้ ชั้นเสื้อโค้ทที่ใสจะเป็นชั้นไอโซทรอปิกและอิเล็กทริกไฟฟ้าเสมอ รูปภาพต่อไปนี้เปรียบเทียบวัสดุคาร์บอนไฟเบอร์ภายใต้รูปแบบวัสดุมาตรฐาน (ซ้าย) กับเสื้อโค้ทที่ชัดเจน (ขวา)
พร็อพเพอร์ตี้ clearCoat
จะควบคุมความแรงของเลเยอร์เสื้อโค้ทที่ชัดเจน และจะถือว่าเป็นค่าไบนารี ซึ่งกําหนดเป็น 0 หรือ 1 ค่ากลางมีประโยชน์ในการควบคุมการเปลี่ยนระหว่างส่วนต่างๆ ของพื้นผิวที่มีชั้นเสื้อผ้าและชิ้นส่วนที่ไม่ชัดเจน
ผลกระทบของ clearCoat
ที่มีต่อโลหะอย่างคร่าวๆ แสดงอยู่ด้านล่าง (คลิกที่รูปภาพเพื่อดูเวอร์ชันที่ใหญ่กว่า)
ความหยาบหนาของเสื้อโค้ท
พร็อพเพอร์ตี้ clearCoatRoughness
คล้ายกับพร็อพเพอร์ตี้ roughness
แต่มีผลกับเลเยอร์เสื้อโค้ทที่ชัดเจนเท่านั้น นอกจากนี้ เนื่องจากชั้นของเสื้อโค้ตที่ชัดเจนนั้นไม่หยาบกระแทกอย่างสิ้นเชิง ค่าระหว่าง 0 ถึง 1 จะแมปใหม่กับความหยาบจริงระหว่าง 0 ถึง 0.6
ผลกระทบของ clearCoatRoughness
ที่มีต่อโลหะอย่างคร่าวๆ แสดงอยู่ด้านล่าง (คลิกที่รูปภาพเพื่อดูเวอร์ชันที่ใหญ่กว่า)
ไอโซโทรปิปี
วัสดุที่ใช้ในชีวิตจริงหลายๆ อย่าง เช่น โลหะแปรงจะทําซ้ําได้โดยใช้โมเดลสะท้อนแสงแบบไอโซทรอปิกเท่านั้น เปลี่ยนวัสดุจากโมเดลไอโซทรอปิกเริ่มต้นเป็นโมเดลแอนไอโซทรอปิกได้โดยใช้พร็อพเพอร์ตี้ anisotropy
รูปภาพต่อไปนี้จะเปรียบเทียบวัสดุไอโซทรอปิก (ซ้าย) กับวัสดุมวลสาร
(ขวา)
ผลที่ตามมาของ anisotropy
ตั้งแต่ 0.0 (ซ้าย) ถึง 1.0 (ขวา) ในโลหะแบบคร่าวๆ จะแสดงอยู่ด้านล่าง (คลิกที่รูปภาพเพื่อดูเวอร์ชันที่ใหญ่กว่า)
รูปภาพด้านล่างแสดงวิธีควบคุมการไฮไลต์ของยาไอโซโทรปิกโดยใช้ค่าบวกหรือค่าลบ: ค่าบวก (ซ้าย) จะให้ค่าสารไอโซโทรปีในค่าแทนเจนต์และค่าลบ (ขวา) ในทิศทางบวก
ทิศทางของแอนไอโซโทรปิก
พร็อพเพอร์ตี้ anisotropyDirection
กําหนดทิศทางของพื้นผิว ณ จุดที่กําหนด คุณจึงควบคุมรูปร่างของไฮไลต์ที่เกี่ยวข้องได้ โดยระบุเป็นเวกเตอร์ของค่า 3 ค่าที่โดยปกติแล้วจะมาจากพื้นผิว เพื่อเข้ารหัสเส้นทางที่อยู่บนพื้นผิว
เอฟเฟกต์การแสดงภาพ anisotropyDirection
บนโลหะที่มีแผนที่ทิศทางแสดงอยู่ด้านล่าง (คลิกที่รูปภาพเพื่อดูขนาดใหญ่ขึ้น)
แผนที่เส้นทางที่ใช้แสดงภาพด้านบนจะแสดงด้านล่าง
การปรับแต่งพื้นผิวโดยรอบ
พร็อพเพอร์ตี้ ambientOcclusion
กําหนดจํานวนแสงแวดล้อมที่เข้าถึงได้ไปยังจุดพื้นผิว ปัจจัยที่เป็นเงาต่อพิกเซลระหว่าง 0.0 (ถูกบดบังทั้งหมด) และ 1.0 (มีแสงสว่างเพียงพอ) พร็อพเพอร์ตี้นี้มีผลกับแสงทางอ้อมแบบกระจาย (แสงแบบรูปภาพ) เท่านั้น ไม่ใช่แสงโดยตรง เช่น การจัดแนว ไฟจุดและแสงแบบจุด หรือแสงที่เฉพาะเจาะจง รูปภาพต่อไปนี้จะเปรียบเทียบวัสดุโดยไม่มีการบดบังแอมเบียนท์ (ซ้าย) กับวัสดุ (ขวา)
ปกติ
คุณสมบัติ normal
จะกําหนดตามปกติของพื้นผิวที่จุดที่ระบุ ซึ่งมักจะมาจากพื้นผิวแผนที่ปกติ ซึ่งช่วยให้คุณเปลี่ยนแปลงคุณสมบัติของแต่ละพิกเซลได้ ค่าปกติจะแสดงในพื้นที่แทนเจนต์ ซึ่งหมายความว่า +Z จะอยู่นอกพื้นผิว
ตัวอย่างเช่น สมมติว่าเราต้องการแสดงชิ้นส่วนเฟอร์นิเจอร์ที่หุ้มด้วยหนังหุ้มเบาะ การสร้างโมเดลรูปเรขาคณิตเพื่อแสดงลวดลายแบบหุ้มลูกเห็บนั้นต้องใช้สามเหลี่ยมมากเกินไป เราจึงรวมตาข่ายที่มีความสูงสูงลงในแผนที่ปกติแทน จากนั้นจึงจะใช้แผนที่ฐานกับ Mesh ที่ปรับให้เรียบง่ายขึ้นได้ รูปภาพต่อไปนี้เปรียบเทียบ Mesh แบบง่ายที่ไม่มีการแมปปกติ (ซ้าย) กับ Mesh (ขวา)
โปรดทราบว่าพร็อพเพอร์ตี้ normal
ส่งผลต่อเลเยอร์ฐาน แต่ไม่ใช่เลเยอร์เสื้อโค้ทที่ชัดเจน
เคลือบเสื้อปกติ
พร็อพเพอร์ตี้ clearCoatNormal
กําหนดตามปกติของเลเยอร์เสื้อโค้ทที่ชัดเจนที่จุดที่ระบุ จะทํางานในลักษณะเดียวกับพร็อพเพอร์ตี้ normal
เรืองแสง
คุณใช้พร็อพเพอร์ตี้ emissive
เพื่อจําลองแสงเพิ่มเติมที่เกิดจากพื้นผิวได้ ค่านี้กําหนดเป็นค่า float4
ที่มีสี RGB (ในพื้นที่เชิงเส้น) รวมถึงค่าชดเชยการรับแสง (ในเวอร์ชันอัลฟ่า)
แม้ว่าจริงๆ แล้วค่าการรับแสงจะบ่งชี้ชุดค่าผสมของการตั้งค่ากล้อง แต่บ่อยครั้งที่ช่างภาพใช้อธิบายความเข้มของแสง ด้วยเหตุนี้ กล้องจึงให้ช่างภาพใช้การชดเชยแสงกับรูปภาพมากหรือน้อยเกินไป การตั้งค่านี้สามารถใช้สําหรับการควบคุมทางศิลปะได้เช่นเดียวกัน และเพื่อให้มองเห็นความเสี่ยงต่อการติดเชื้อได้อย่างเหมาะสม (เช่น ความเสี่ยงต่อการติดเชื้อจะสัมผัสกับสีเทา 18%)
ค่าชดเชยที่แผ่รังสีของคุณสมบัติแสงสามารถบังคับสีที่มีสีสว่างให้สว่างขึ้น (ค่าบวก) หรือเข้ม (ค่าติดลบ) มากกว่าค่าปัจจุบัน หากเปิดใช้เอฟเฟกต์บาน การใช้ค่าชดเชยการรับแสงที่เป็นบวกจะทําให้พื้นผิวบานได้
รุ่นของผ้า
วัสดุทั้งหมดที่อธิบายไว้ก่อนหน้านี้ได้รับการออกแบบมาเพื่อจําลองพื้นผิวที่หนาแน่น ทั้งในระดับมาโครและในระดับไมโคร แต่เสื้อผ้าและผ้ามักเป็นเส้นใยแบบหลวมๆ ที่ช่วยดูดซับและกระจายแสงของเหตุการณ์ เมื่อเทียบกับพื้นผิวที่แข็ง ผ้ามีลักษณะเป็นลื่นของสเปกตรัมที่นุ่มนวลขึ้นโดยมีการตกหล่นขนาดใหญ่และมีแสงจ้ากระจาย ซึ่งเกิดจากการกระจัดกระจายไปข้างหน้า/ถอยหลัง ผ้าบางอย่างจะแสดงสีสเปกโทนสี 2 โทน (ผ้ากํามะหยี่)
ภาพต่อไปนี้จะเปรียบเทียบผ้ายีนส์ฟอกที่แสดงผลโดยใช้รูปแบบมาตรฐาน (ซ้าย) กับรูปแบบผ้า (ขวา) สังเกตวิธีที่รูปแบบวัสดุมาตรฐานไม่สามารถเก็บตัวอย่างเสื้อผ้ายีนส์ฟอก (ซ้าย) ได้ พื้นผิวจะมีความแข็ง (คล้ายพลาสติกแทบจะ) เหมือนกับผ้าหนึ่งๆ ผ้ามากกว่าเสื้อผ้า นอกจากนี้ สิ่งนี้ยังแสดงความสําคัญของกลีบที่อ่อนนุ่มกว่าซึ่งเกิดจากการดูดซึมและกระจัดกระจายตามกิจกรรมนันทนาการโดยบริสุทธิ์ของเนื้อผ้า
Vevelet เป็นกรณีการใช้งานที่น่าสนใจสําหรับโมเดลวัสดุผ้า ตามที่แสดงในรูปภาพด้านล่าง ผ้าประเภทนี้แสดงให้เห็นถึงการจัดแสงที่ขอบสําคัญ เนื่องจากกระจัดกระจายข้างหน้าและหลัง เหตุการณ์กระจายเหล่านี้เกิดจากเส้นใยที่ยืนตรงพื้นผิวของผ้า เมื่อไฟเหตุการณ์มาจากทิศทางตรงข้ามกับทิศทางมุมมอง เส้นใยจะกระจายแสง ในทํานองเดียวกัน เมื่อไฟเหตุการณ์มาจากทิศทางเดียวกับทิศทางมุมมอง เส้นใยจะกระจายแสงไปข้างหลัง
โปรดทราบว่ามีผ้าบางประเภทที่ยังคงทําโมเดลที่ดีที่สุดจากโมเดลวัสดุพื้นผิวแข็ง เช่น หนัง ผ้าไหม และผ้าซาติน สามารถสร้างขึ้นใหม่โดยใช้วัสดุทั่วไป
โมเดลผ้าหุ้มนี้ครอบคลุมพารามิเตอร์ทั้งหมดที่กําหนดไว้ก่อนหน้านี้สําหรับโหมดวัสดุมาตรฐาน ยกเว้นโลหะและเงาสะท้อน นอกจากนี้ยังมีพารามิเตอร์เพิ่มเติม 2 รายการที่อธิบายไว้ในตารางด้านล่างด้วย
พารามิเตอร์ | คำจำกัดความ |
---|---|
สีเชน | ปรับสมดุลสีเขียว-แดงเพื่อสร้างผ้าสเปกต์โทนสี 2 สี (ค่าเริ่มต้นเป็น \(\sqrt{baseColor}\)) |
สีผิวหน้าย่อย | ย้อมสีกระจายหลังจากกระจายและซึมซับผ่านวัสดุ |
ประเภทและช่วงของพร็อพเพอร์ตี้แต่ละรายการอธิบายไว้ในตารางด้านล่างนี้
พร็อพเพอร์ตี้ | ประเภท | ช่วง | หมายเหตุ |
---|---|---|---|
สีเชน | ทศนิยม 3 | [0..1] | RGB เชิงเส้น |
สีผิวหน้าย่อย | ทศนิยม 3 | [0..1] | RGB เชิงเส้น |
หากต้องการสร้างสีที่คล้ายเวลเวท ให้ตั้งค่าสีฐานเป็นสีดํา (หรือสีเข้ม) คุณควรตั้งค่าข้อมูลสีเป็นสีแทน หากต้องการสร้างผ้าทั่วไป เช่น ผ้ายีนส์ ผ้าฝ้าย ฯลฯ ให้ใช้สีฐานเป็นสี แล้วใช้สีฮีนเริ่มต้นหรือกําหนดให้สีส่วนหนึ่งเป็นความสว่างของสีฐาน
สีของ Sheen
คุณใช้พร็อพเพอร์ตี้ sheenColor
เพื่อแก้ไขการสะท้อนของข้อมูลจําเพาะได้โดยตรง ช่วยให้คุณควบคุมลักษณะของผ้าได้ดีขึ้นและ
ช่วยให้ผลิตวัสดุที่สเปรย์โทนสี 2 ชิ้นได้
ภาพต่อไปนี้จะเปรียบเทียบผ้าสีน้ําเงินกับจะมี (ไม่มี) (ไม่มี) และประแจ (ขวา) (คลิกรูปภาพเพื่อดูขนาดใหญ่)
สีพื้นผิวด้านล่าง
พร็อพเพอร์ตี้ subsurfaceColor
ไม่ได้อิงตามรูปร่างและใช้เพื่อจําลองการซึมซับ การดูดซึมบางส่วน และการปล่อยแสงบางประเภทในผ้าบางประเภทได้ วิธีนี้เป็นประโยชน์อย่างยิ่งในการสร้างผ้านุ่ม
ภาพต่อไปนี้แสดงผลกระทบของ subsurfaceColor
โดยเป็นผ้าสีขาว (คอลัมน์ซ้าย) เทียบกับผ้าสีขาวที่มีพื้นผิวด้านหน้าเป็นสีน้ําตาล (คอลัมน์ขวา) คลิกที่รูปภาพเพื่อดูขนาดใหญ่ขึ้น
โมเดลที่ไม่มีแสงสว่าง
โมเดลแสงสว่างไม่ได้ใช้เพื่อปิดการคํานวณแสงทั้งหมด วัตถุประสงค์หลักคือการแสดงองค์ประกอบที่มีแสงสว่างล่วงหน้า เช่น cubemap, เนื้อหาภายนอก (เช่น สตรีมวิดีโอหรือสตรีมกล้อง) อินเทอร์เฟซผู้ใช้ การแสดงภาพ/การแก้ไขข้อบกพร่อง ฯลฯ โมเดลที่ไม่มีแสงสว่างจะแสดงพร็อพเพอร์ตี้เพียง 2 รายการที่อธิบายไว้ในตารางด้านล่าง
พร็อพเพอร์ตี้ | คำจำกัดความ |
---|---|
สีฐาน | สีกระจายของพื้นผิว |
ใหญ่พิเศษ | สีกระจายแบบอื่นๆ เพื่อจําลองพื้นผิวที่มีความร้อน คุณสมบัตินี้เป็นประโยชน์ในไปป์ไลน์ HDR ที่มี Bloom Pass |
ประเภทและช่วงของพร็อพเพอร์ตี้แต่ละรายการอธิบายไว้ในตารางด้านล่างนี้
พร็อพเพอร์ตี้ | ประเภท | ช่วง | หมายเหตุ |
---|---|---|---|
สีฐาน | ทศนิยม 4 | [0..1] | RGB เชิงเส้นที่คูณล่วงหน้า |
ใหญ่พิเศษ | ทศนิยม 4 | rgb=[0..1], a=N/A | คูณ RGB เชิงเส้นแบบทวีคูณ มีอัลฟ่า |
ค่าของ emissive
จะเพิ่มลงใน baseColor
เมื่อมีอยู่ การใช้งาน emissive
หลักคือบังคับให้แพลตฟอร์มที่มีแสงสว่างไม่บานหากกําหนดค่าไปป์ไลน์ HDR ด้วย Bloom Pass
รูปภาพต่อไปนี้แสดงตัวอย่างรูปแบบ Material ที่ไม่มีแสงสว่างซึ่งใช้แสดงผลข้อมูลการแก้ไขข้อบกพร่อง (คลิกที่รูปภาพเพื่อดูขนาดใหญ่ขึ้น)
การใช้สี
สีเชิงเส้น
หากข้อมูลสีมาจากพื้นผิว เพียงใช้พื้นผิว sRGB เพื่อรับประโยชน์จากการแปลงฮาร์ดแวร์อัตโนมัติจาก sRGB เป็นเชิงเส้น หากมีการส่งข้อมูลสีเป็นพารามิเตอร์ไปยังวัสดุที่คุณสามารถแปลงจาก sRGB เป็นเส้นตรงได้ โดยเรียกใช้อัลกอริทึมต่อไปนี้ในแต่ละแชแนลสี
float sRGB_to_linear(float color) {
return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
}
นอกจากนี้ คุณยังใช้เวอร์ชันใดเวอร์ชันหนึ่งที่ถูกกว่าได้แต่ก็ยังไม่ถูกต้องด้านล่างนี้
// Cheaper
linearColor = pow(color, 2.2);
// Cheapest
linearColor = color * color;
อัลฟ่าแบบทวีคูณ
สีจะใช้อัลฟ่าก่อนนําไปคูณหากองค์ประกอบ RGB คูณกับแชแนลอัลฟ่า
// Compute pre-multiplied color
color.rgb *= color.a;
ถ้าสีเป็นแบบสุ่มตัวอย่างจากพื้นผิว คุณสามารถแน่ใจได้ว่าข้อมูลพื้นผิวจะมีการทวีคูณล่วงหน้า ใน Android ระบบจะคูณพื้นผิวที่อัปโหลดจากบิตแมปโดยค่าเริ่มต้น