ข้อมูลอ้างอิงเนื้อหาที่กําหนดเอง

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&#39 โหมดผสมผสานนี้จะถือว่ามีการคูณอัลฟ่าแบบทวีคูณ
  • จางลง: ทําหน้าที่เป็น 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&#39 รูปแบบการลงสีทางกายภาพนี้ออกแบบมาเพื่อรองรับการทํางานร่วมกันด้วยเครื่องมือและเครื่องมือทั่วไปอื่นๆ เช่น 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 ระบบจะคูณพื้นผิวที่อัปโหลดจากบิตแมปโดยค่าเริ่มต้น