ไฟล์ Sceneform Asset Definition (*.sfa) คือคําอธิบายเนื้อหาที่ไบนารีของ Sceneform (*.sfb) อ่านได้ ซึ่งชี้ไปที่โมเดล คําจํากัดความ และพื้นผิวของชิ้นงานต้นฉบับ รวมถึงมีพารามิเตอร์เนื้อหาสําหรับวัสดุที่อิงกับ Sceneform จริง
ไฟล์นี้สร้างขึ้นโดยอัตโนมัติโดยปลั๊กอิน Sceneform Android
Studio เป็นครั้งแรก แต่คุณสามารถปรับแต่งแอตทริบิวต์เพื่อเปลี่ยนรูปลักษณ์ของเนื้อหาได้ ข้อมูลอ้างอิงนี้อธิบายแอตทริบิวต์ที่คุณกําหนดค่าให้แก้ไขรูปลักษณ์ของเนื้อหาได้ แอตทริบิวต์ที่ไม่บังคับที่ไม่อยู่ใน sfa จะมีค่าเริ่มต้น ไวยากรณ์ของ sfa คือ jsonnet ซึ่งเป็นส่วนขยายของ JSON
ไวยากรณ์
{
materials: [
{
name: "<name>",
parameters: [
{
<parameterName>: <parameterDefaultValue>,
},
…
],
source: "path/to/source_material.sfm",
},
…
],
model: {
attributes: [
"Position",
"TexCoord",
"Orientation",
],
file: "path/to/source_asset.ext",
name: "<Name>",
scale: 1.0,
recenter: false,
smoothing_angle: 45.0,
flip_texture_coordinates: false,
fix_infacing_normals: false,
},
samplers: [
{
file: "path/to/source_texture.ext",
name: "<name>",
params: {
usage_type: "Color",
mag_filter: "Linear",
min_filter: "NearestMipmapLinear",
wrap_s: "Repeat",
wrap_t: "Repeat",
},
pipeline_name: "<pipeline_name>",
},
…
]
}
แอตทริบิวต์
materials[].parametersเนื้อหาของการบล็อกนี้ขึ้นอยู่กับคําจํากัดความของเนื้อหาที่ระบุโดยแอตทริบิวต์
sourceสําหรับสื่อเริ่มต้น (
*.sfm) ดูรายการพารามิเตอร์ที่รองรับดังนี้- เนื้อหา OBJ:
obj_material.sfm - เนื้อหา FBX:
fbx_material.sfm - เนื้อหา glTF:
gltf_material.sfm
สําหรับสื่อที่กําหนดเอง (
*.mat) รายการพารามิเตอร์ที่รองรับจะระบุไว้ในไฟล์*.matดังนี้- ดูข้อมูลอ้างอิงเนื้อหาที่กําหนดเอง
- เนื้อหา OBJ:
materials[].source- ระบุไฟล์การกําหนดวัสดุ ไม่ว่าจะเป็นไฟล์คําจํากัดความวัสดุเริ่มต้น (
*.sfm) หรือไฟล์คําจํากัดความที่กําหนดเอง (*.mat)
model.attributesกําหนดชุดสตรีมจุดยอดที่ส่งออก ซึ่งคํานวณในระหว่างการนําเข้าของโมเดลแหล่งที่มา ค่าที่เป็นไปได้มีดังนี้
ค่า คำอธิบาย "Color"จุดยอด COLOR"Orientation"จุดยอด TANGENT"Position"จุดยอด POSITION"TexCoord"TEXCOORD0ซึ่งเป็นพิกัดรังสียูวีแรก
model.file- แอตทริบิวต์ที่จําเป็นมีเส้นทางระบบไฟล์ไปยังไฟล์ชิ้นงานต้นทาง
รูปแบบที่รองรับในขณะนี้ ได้แก่
*.fbx,*.obj,*.gltf,*.glb
model.scaleแอตทริบิวต์ที่ไม่บังคับ ค่าเริ่มต้นคือ
1.0ควบคุมขนาดของโมเดลที่ส่งออก เทียบกับเนื้อหาแหล่งที่มา ขนาด2.0จะทําให้เนื้อหามีขนาดใหญ่ขึ้น 2 เท่าค่าตําแหน่งของฉากจะระบุเป็นหน่วยเมตร ระบบคํานวณระยะเวลาการปรับขนาดโดยอัตโนมัติระหว่างการนําเข้าเริ่มต้นเพื่อให้แกนที่ใหญ่ที่สุดไม่น้อยกว่า 5 ซม. และแกนขนาดเล็กที่สุดไม่เกิน 1 ม. เพื่อรองรับความแตกต่างของหน่วยมาตรฐาน ทั้งนี้เพื่อให้การนําเข้าครั้งแรก ไม่ใช่การบังคับใช้ขีดจํากัดเหล่านี้
model.recenterแอตทริบิวต์ที่ไม่บังคับ ค่าเริ่มต้นคือ
falseควบคุมการวางตําแหน่ง ของรูปเรขาคณิตที่ส่งออก ค่าที่เป็นไปได้มีดังนี้ค่า คำอธิบาย falseเรขาคณิตจะส่งออกตามที่ได้รับอนุญาตโดยไม่ต้องเปลี่ยน trueจุดศูนย์กลางของรูปเรขาคณิต จะอยู่ในจุดเริ่มต้น "root"ระบบจะส่งออกรูปเรขาคณิตเพื่อให้จุดศูนย์กลางอยู่ในจุดกําเนิดโดยตรง และปรับในแนวตั้งเพื่อให้จุดยอดต่ําสุดอยู่ในระดับเดียวกับจุดยอด ซึ่งใช้เพื่อให้โมเดลที่ส่งออกซึ่งอยู่ในตําแหน่ง Anchor หรือเครื่องบินจะตั้งอยู่เหนือจุดยึดนี้ {x:float, y:float, z:float}ระบบจะส่งออกรูปทรงเรขาคณิตเพื่อให้ต้นทางวางอยู่ตามจุดที่ระบุ {x:0, y:0, z:0}สอดคล้องกับค่าต่ําสุดของกรอบการปรับแนวตามแกนของรูปทรงเรขาคณิต{x:1, y:1, z:1}สอดคล้องกับจํานวนสูงสุดของกรอบการปรับแนวแกนของ รูปทรงเรขาคณิต}
model.smoothing_angle- แอตทริบิวต์ที่ไม่บังคับที่ระบุหน่วยเป็นองศา ค่าเริ่มต้นคือ
45ชิ้นงานแหล่งที่มา ไม่มีค่าปกติต่อจุดยอด (เช่นobj) จะสร้างค่าปกติต่อจุดยอดมุม โดยใช้ความลื่นไหล เพื่อจํากัดชุดปกติของใบหน้าที่ใช้ในการคํานวณจุดยอดมุมปกติ ขอบในโมเดลที่เกินมุมนี้จะปรากฏ 'ยาก' หรือด้านที่หุ้มขอบ ขอบที่เกินจะแสดงอย่างเรียบเนียน
model.flip_texture_coordinates- แอตทริบิวต์ที่ไม่บังคับ ค่าเริ่มต้นคือ
falseหากเป็น"จริง"พิกัดแนวตั้งจะกลับกัน ((u, v) -> (u, 1 - v)) ระหว่างการนําเข้า วิธีนี้ช่วยรองรับความแตกต่างระหว่าง ที่ผ่านมาระหว่าง OpenGL/Direct3D
model.fix_infacing_normals- แอตทริบิวต์ที่ไม่บังคับ ค่าเริ่มต้นคือ
falseหากเป็น "จริง" การนําเข้าจะพยายามค้นหาและแก้ไขตามปกติที่เผชิญอยู่ (ค่าปกติชี้ไปยัง 'ใน' พื้นผิว ซึ่งตรงข้ามกับ ' จาก' พื้นผิว
samplers[].params.usage_type- กําหนดวิธีที่รันไทม์ตีความข้อมูลรูปภาพที่เข้ารหัส ใช้
"Color"สําหรับพื้นผิว รูปภาพ RGB ใช้"Data"หรือ"Normal"เพื่อจัดการเนื้อหาของรูปภาพให้เหมือนกับอยู่ในพื้นที่เชิงเส้น ค่าเริ่มต้นคือ"Color"
samplers[].params.mag_filterกําหนดตัวกรองการลดขนาดที่ใช้เมื่อตัวอย่าง Mipmap มีขนาดใหญ่กว่าขนาดพิกเซลของรูปเรขาคณิต ค่าเริ่มต้นคือ
"Linear"ค่าที่เป็นไปได้มีดังนี้ค่า คำอธิบาย "Nearest"สอดคล้องกับ GL_NEARESTแสดงค่าขององค์ประกอบพื้นผิวที่ใกล้ที่สุด (อยู่ห่างจากแมนฮัตตัน) ไปยังจุดศูนย์กลางของพิกเซลที่มีการกําหนดพื้นผิว"Linear"สอดคล้องกับ GL_LINEARแสดงผลค่าเฉลี่ยถ่วงน้ําหนักขององค์ประกอบองค์ประกอบ 4 รายการที่อยู่ใกล้กับจุดกึ่งกลางของพิกเซลที่ใกล้ที่สุด ซึ่งอาจรวมถึงองค์ประกอบพื้นผิวเส้นขอบ ขึ้นอยู่กับค่าของพื้นผิวwrap_sและพื้นผิวwrap_tและในการแมปที่แน่นอน
samplers[].params.min_filterกําหนดตัวกรองการลดขนาดที่ใช้เมื่อตัวอย่าง Mipmap มีขนาดใหญ่กว่าขนาดพิกเซลของรูปเรขาคณิต ค่าเริ่มต้นคือ
"NearestMipmapLinear"ค่าที่เป็นไปได้มีดังนี้ค่า คำอธิบาย "Nearest"สอดคล้องกับ GL_NEARESTแสดงค่าขององค์ประกอบพื้นผิวที่ใกล้ที่สุด (ระยะทางแมนฮัตตัน) อยู่ตรงกลางของพิกเซลที่มีการกําหนดพื้นผิว"Linear"สอดคล้องกับ GL_LINEARแสดงผลค่าเฉลี่ยถ่วงน้ําหนักขององค์ประกอบองค์ประกอบ 4 แบบที่อยู่ใกล้กับกึ่งกลางของพื้นผิวมากที่สุด ซึ่งอาจรวมถึงองค์ประกอบเส้นขอบ โดยขึ้นอยู่กับค่าของพื้นผิวwrap_sและพื้นผิวwrap_tและในการแมปที่แน่นอน"NearestMipmapNearest"สอดคล้องกับ GL_NEAREST_MIPMAP_NEARESTเลือกแผนผังขนาดเล็กที่ใกล้เคียงกันที่สุดกับขนาดของพิกเซลที่มีการกําหนดพื้นผิว และใช้เกณฑ์"Nearest"(องค์ประกอบพื้นผิวที่อยู่ใกล้จุดกึ่งกลางของพิกเซลมากที่สุด) เพื่อสร้างค่าพื้นผิว"LinearMipmapNearest"สอดคล้องกับ GL_NEAREST_MIPMAP_LINEARเลือก Mipmap 2 รายการที่ตรงกับขนาดของพิกเซลที่มีพื้นผิวมากที่สุด และใช้เกณฑ์"Nearest"(องค์ประกอบของพื้นผิวที่อยู่ใกล้กับจุดศูนย์กลางของพิกเซลมากที่สุด) เพื่อสร้างค่าพื้นผิวจาก Mipmap แต่ละรายการ ค่าพื้นผิวสุดท้ายคือค่าเฉลี่ยถ่วงน้ําหนักของ 2 ค่านั้น"LinearMipmapLinear"สอดคล้องกับ GL_LINEAR_MIPMAP_LINEARเลือก Mipmap 2 รายการที่ตรงกับขนาดของพิกเซลที่มีการกําหนดพื้นผิวมากที่สุด และใช้เกณฑ์"Linear"(ค่าเฉลี่ยแบบถ่วงน้ําหนักที่ระบุองค์ประกอบของพื้นผิว 4 รายการที่อยู่ใกล้กับจุดกึ่งกลางของพิกเซลมากที่สุด) เพื่อสร้างค่าพื้นผิวจาก Mipmap แต่ละรายการ ค่าพื้นผิวสุดท้ายคือค่าเฉลี่ยถ่วงน้ําหนักของ 2 ค่าเหล่านั้น
samplers[].params.wrap_sแอตทริบิวต์ที่ไม่บังคับ ค่าเริ่มต้นคือ
"Repeat"ควบคุมลักษณะการ Wrap แนวนอนค่า คำอธิบาย "ClampToBorder"สอดคล้องกับ GL_CLAMP_TO_BORDER"ClampToEdge"สอดคล้องกับ GL_CLAMP_TO_BORDER"MirroredRepeat"สอดคล้องกับ GL_MIRRORED_REPEAT"MirrorClampToEdge"สอดคล้องกับ GL_MIRROR_CLAMP_TO_EDGE"Repeat"สอดคล้องกับ GL_REPEAT
samplers[].params.wrap_tแอตทริบิวต์ที่ไม่บังคับ ค่าเริ่มต้นคือ
"Repeat"ควบคุมลักษณะการ Wrap แนวตั้งค่า คำอธิบาย "ClampToBorder"สอดคล้องกับ GL_CLAMP_TO_BORDER"ClampToEdge"สอดคล้องกับ GL_CLAMP_TO_BORDER"MirroredRepeat"สอดคล้องกับ GL_MIRRORED_REPEAT"MirrorClampToEdge"สอดคล้องกับ GL_MIRROR_CLAMP_TO_EDGE"Repeat"สอดคล้องกับ GL_REPEAT
พารามิเตอร์สําหรับวัสดุเริ่มต้น
Sceneform มีการให้คําจํากัดความสื่อเริ่มต้น 3 แบบ โดยแบบแรกสําหรับเนื้อหา OBJ, แบบหนึ่งสําหรับเนื้อหา FBX และอีกแบบหนึ่งสําหรับชิ้นงาน glTF
ส่วนนี้จะแสดงพารามิเตอร์เนื้อหาที่การกําหนดค่าเริ่มต้นแต่ละรายการระบุไว้
obj_material.sfm
| พารามิเตอร์ | ค่า | คำอธิบาย |
|---|---|---|
baseColor
|
<sampler_name>
|
คํานวณ baseColor เป็นค่าจากตัวอย่างคูณด้วยสีที่มีการประมาณ |
null
|
ประมวลผล baseColor เป็นสีที่เลือกแทน หรือสีขาวหากไม่มีสีที่ไม่มีการประมาณ |
|
baseColorTint
|
<vec4>
|
ใช้แต้มสีกับค่า baseColor ที่คํานวณแล้ว ซึ่งระบุเป็น [r, b,
g, a] |
metallic
|
<float_value>
|
ควบคุมความเป็นโลหะของวัสดุ ใช้ 0.0 สําหรับวัสดุที่ไม่ใช่โลหะใช้ 1.0 สําหรับวัสดุโลหะ |
roughness
|
<float_value>
|
ควบคุมความหยาบของวัสดุ ใช้ค่าที่ต่ําสําหรับวัสดุมันวาว ( 0.0 แสดงถึงกฤษณ์ที่สมบูรณ์แบบ)ใช้ค่าสูงๆ สําหรับวัสดุกระจายสี ( 1.0 แสดงถึงวัสดุที่ไม่ส่องแสง) |
opacity |
null |
ทึบสนิท |
<float_value>
|
เปิดใช้ความโปร่งใสแล้ว1.0 เป็นแบบทึบสนิท0.0 มีความโปร่งใสทั้งหมด |
fbx_material.sfm
| พารามิเตอร์ | ค่า | คำอธิบาย |
|---|---|---|
baseColor
|
<vec4>
|
ปัจจัยการแต้มสีในผลลัพธ์ของ baseColorMap ระบุเป็น [r, g, b,
a] |
baseColorMap
|
<sampler_name>
|
Result คือค่าตัวอย่างของ baseColorMap |
null |
เปลี่ยนเป็นสีขาว | |
normalMap
|
<sampler_name>
|
แปลค่าผลลัพธ์ตัวอย่างเป็นการเว้นวรรคแบบพื้นที่ปกติ โดยใช้ในการคํานวณแสง |
null
|
ใช้ [0, 0, 1] คงที่เป็นค่าปกติแทนเจนต์ของเรา |
|
metallic
|
<float_value>
|
ปรับขนาด metallicMap เพื่อควบคุมโลหะโลหะใช้ 0.0 สําหรับวัสดุที่ไม่ใช่โลหะใช้ 1.0 สําหรับวัสดุโลหะ |
metallicMap
|
<sampler_name>
|
ใช้ค่าแชแนลสีแดงจากตัวอย่างเป็น
ค่า metallicMap |
null
|
ใช้ 1.0 คงที่เพื่อปรับขนาด
metallic |
|
roughness
|
<float_value>
|
ปรับขนาด roughnessMap เพื่อควบคุมความหยาบของวัสดุใช้ความหยาบต่ําสําหรับวัสดุวาว ใช้ความหยาบสูงสําหรับวัสดุกระจาย |
roughnessMap
|
<sampler_name>
|
ใช้ค่าแชแนลสีแดงจากตัวอย่างเป็น
ค่า roughnessMap |
null
|
ใช้ 1.0 คงที่เพื่อปรับขนาด
roughness |
|
reflectance
|
<float_value>
|
ควบคุมการสะท้อนของวัสดุ ค่าเริ่มต้น 0.5 จะครอบคลุมวัสดุเกือบทั้งหมดที่เป็นไปได้ |
opacity
|
null
|
ไม่มีการควบคุมความทึบแสงที่ชัดเจน หากระบุแผนที่ความทึบแสงในข้อมูลต้นฉบับ วัสดุจะแสดงผลด้วยการผสานกันอย่างโปร่งใส |
gltf_material.sfm
| พารามิเตอร์ | ค่า | คำอธิบาย |
|---|---|---|
baseColorFactor
|
<vec4>
|
ปัจจัยเล็กน้อยในผลลัพธ์ของ baseColor ซึ่งระบุเป็น [r, g, b,
a] |
normal
|
<sampler_name>
|
แปลความหมายผลลัพธ์ตัวอย่างเป็นการเว้นวรรคที่ปกติ (Tangent-space) ใช้ในการคํานวณแสง |
null
|
ใช้ค่าคงที่ [0, 0, 1]
เป็นค่าแทนเจนต์พื้นที่ปกติ |
|
metallicFactor
|
<float_value>
|
ปรับขนาด metallicRoughness
เพื่อควบคุมความโลหะ
ของวัสดุใช้ 0.0 สําหรับวัสดุที่ไม่ใช่โลหะใช้ 1.0
สําหรับวัสดุโลหะ |
roughnessFactor
|
<float_value>
|
ปรับสเกล metallicRoughness
เพื่อควบคุมความหยาบของวัสดุ
ใช้ความหยาบต่ําสําหรับวัสดุมันวาว ใช้ความหยาบสูง เพื่อกระจายวัสดุ แบบกระจาย |
metallicRoughness
|
<sampler_name>
|
ใช้ช่องสีเขียวจากตัวอย่างเพื่อความหยาบ
(ปรับขนาดโดย
roughnessFactor)ใช้ช่องสีน้ําเงินจากตัวอย่างสําหรับโลหะ (ปรับขนาดโดย metallicFactor) |
null
|
ใช้ metallicFactor และ
roughnessFactor |
|
occlusion
|
<sampler_name>
|
ใช้ช่องสีแดงจากตัวอย่างเพื่อบดบังบรรยากาศ |
null
|
หากมีพื้นผิว metallicRoughness ให้ใช้ช่องสีแดงเพื่อเพิ่มการบังแสงโดยรอบ |
|
emissiveFactor
|
<float_value>
|
ปรับขนาด emissive เพื่อควบคุมการปล่อยก๊าซของวัสดุใช้ 0.0
สําหรับวัสดุที่ไม่สร้างแสงของตัวเอง |
emissive
|
<sampler_name>
|
ใช้สีจากตัวอย่างเป็นค่าเชิงรับ |
null |
ไม่มีการปล่อยก๊าซ | |
reflectance
|
<float_value>
|
ควบคุมการสะท้อนของวัสดุ ค่าเริ่มต้น 0.5 จะครอบคลุมวัสดุเกือบทั้งหมดที่เป็นไปได้ |
หากมีการระบุเวลาปิดรับคําสั่งซื้ออัลฟ่าในข้อมูลต้นฉบับ วัสดุจะแสดงผลโดยมีการผสานมาสก์ หากเปิดใช้การผสานเนื้อหาในแหล่งที่มา ระบบจะเปิดใช้ความโปร่งใส
การแทนที่หรือเพิ่มพื้นผิว
บล็อก samplers จะกําหนดพื้นผิวที่ใช้ได้กับวัสดุของคุณ ระเบียนตัวอย่างซึ่งเริ่มต้นจากเนื้อหาแหล่งที่มาจะประกาศ pipeline_name จึงระบุที่ไม่ซ้ําตามเส้นทางรูปภาพต้นฉบับในชิ้นงานแหล่งที่มา ช่อง file สามารถเปลี่ยนแปลง
มีเส้นทางไฟล์ app/ ที่เกี่ยวข้อง ตัวอย่างเช่น โค้ด
{
file: "sampledata/models/textures/dandy_andy.png",
name: "andy",
pipeline_name: "andy.png",
},
จะแทนที่พื้นผิวต้นทางที่เรียกว่า andy.png ในเนื้อหาแหล่งที่มาด้วยเนื้อหาของไฟล์
./sampledata/models/textures/dandy_andy.png
ระบบอาจไม่นําเข้าพื้นผิวที่ประกาศไว้ในชิ้นงานแหล่งที่มาบางส่วนหรือทั้งหมดลงในชิ้นงานโดยอัตโนมัติ ซึ่งในกรณีนี้จะมีการเพิ่มพื้นผิวลงใน SFA คุณจะเพิ่มพื้นผิวให้กับโมเดลใดก็ได้ที่มี TexCoord ในรายการแอตทริบิวต์ ผู้ใช้จะระบุบล็อก injections แทน pipeline_name ซึ่งใช้กับตัวอย่างที่นําเข้าโดยอัตโนมัติเท่านั้น
ลองดูตัวอย่างของ FBX ที่มีแอตทริบิวต์ TexCoord แต่ไม่มีพื้นผิว คุณเพิ่มไฟล์ภาพในโฟลเดอร์โครงการแล้วลิงก์กับบล็อกตัวอย่างใหม่ได้ จากนั้นการแทรกจะประกาศการใช้งานในชื่อ "Normal" ในโค้ดต่อไปนี้
{
file: "sampledata/models/cragly_normal.png",
name: "bumps",
injections: [
{usage: "Normal",},
],
},
ในขั้นตอนนี้ พื้นผิวจะใช้กับวัสดุของคุณได้ ในการแสดงตัวอย่าง
ให้ตรวจสอบว่าคําขอเนื้อหาตัวอย่างสําหรับพารามิเตอร์ normalMap ตรงกัน (มิเช่นนั้น ตัวอย่างดังกล่าวจะปรากฏว่าไม่ได้ใช้งานและจะได้รับการแก้ไข) เมื่อพิจารณาชื่อ bumps ในตัวอย่างบล็อกของเราแล้ว บล็อกเนื้อหาของเราควรมีโค้ดต่อไปนี้
{
normalMap: 'bumps',
},
การใช้งานที่พร้อมใช้งานสําหรับการบล็อกการแทรกคือ BaseColor,
Metallic,Normal,Emissive,
Roughness และ Occlusion