يوفّر Sceneform تعريفات تلقائية للمواد (.sfm
) لتسهيل حصول مطوّري البرامج على نتائج رائعة. يمكن لمطوّري البرامج الذين يريدون تخصيص طريقة عرض مواد العرض بعمق إنشاء ملفات تعريفات خاصة بهم (*.mat
ملفات) وتطبيقها على مواد العرض الخاصة بهم، وذلك من خلال تحديد السمة source
في تعريف مادة العرض.
المفاهيم الأساسية
- المواد
- تحدّد المادة الأساسية المظهر المرئي للأسطح. لتقديم وصف
للسطح وعرضه بالكامل، توفّر المادة التالية
المعلومات التالية:
- طراز المادة
- مجموعة من المعلمات المُسماة التي يتحكّم فيها الاستخدام
- حالة البكسلة (وضع المزج، اختيار الوجه الخلفي، إلخ.)
- رمز تظليل Vertex
- رمز أداة تظليل جزء
- طراز المادة
- يُعرف أيضًا باسم نموذج التظليل أو نموذج الإضاءة، ويحدّد نموذج المادة الخصائص الأساسية للسطح. وتؤثر هذه الخصائص بشكل مباشر في طريقة احتساب الإضاءة وبالتالي على شكل السطح.
- تعريف المادة
- ملف نصي يصف جميع المعلومات المطلوبة من خلال مادة معيّنة توضّح هذه الصفحة بنية ملفات تعريف المواد (
*.mat
) وتنسيقها.
تعريفات المواد
تعريف المادة هو ملف نصي يصف جميع المعلومات المطلوبة من خلال مادة معيّنة:
- الاسم
- معلَمات المستخدم
- طراز المادة
- السمات المطلوبة
- المواد المتداخلة (المعروفة باسم المتغيّرات)
- حالة البكسلة (وضع المزج، إلخ)
- رمز التظليل (أداة تظليل الأجزاء، تظليل رأسي اختياري)
التنسيق
إنّ تنسيق تعريف المادة هو تنسيق يستند بشكلٍ غير منظَّم إلى 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
). على الرغم من أن هذه البنية صالحة تمامًا في تعريف المادة، فإنه يمكن أيضًا قبول صيغة بدون علامات اقتباس حول السلاسل بتنسيق JSON:
key : value
تظل علامات الاقتباس إلزامية عندما تحتوي السلسلة على مسافات.
يحتوي القالبان vertex
وfragment
على رمز GLSL لم يتم تجاوزه ولا يتضمن علامات اقتباس، وهو غير صالح في JSON.
يُسمح بإضافة تعليقات من سطر C++ واحد.
إنّ مفتاحَي الإقران حسّاسَين لحالة الأحرف.
قيمة الزوج غير حساسة لحالة الأحرف.
مثال
تعرض قائمة الرموز التالية مثالاً على تعريف أساسي للمواد. ويستخدم هذا التعريف نموذج المادة المضاءة، كما يستخدم وضع المزج المُعتِم
التلقائي، ويتطلّب عرض مجموعة من إحداثيات الأشعة فوق البنفسجية في الشبكة المتداخلة المعروضة وتحدّد 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 {
shadingModel : unlit
}
المَعلَمات
- النوع
- صفيف كائنات المعلّمات
- القيمة
كل إدخال هو كائن يتضمن السمتَين
name
وtype
، وكلاهما من النوعstring
. يجب أن يكون الاسم معرّف GLSL صالحًا. يجب أن يكون النوع واحدًا من الأنواع الموضّحة في الجدول أدناه.النوع الوصف قيمة منطقية قيمة منطقية واحدة منطقية2 متّجه للمنطقَين قيمة منطقية 3 متّجه مكوّن من 3 قيم منطقية منطقية4 متّجه مكوّن من 4 قيم منطقية عدد عائم قيمة عائمة واحدة قيمة عائمة2 متّجه عائم قيمة عائمة3 متّجه لـ 3 عوامات قيمة عائمة4 متّجه لـ 4 عوامات int عدد صحيح واحد int2 متّجه مكوّن من عددين صحيحين int3 متّجه مكوّن من 3 أعداد صحيحة int4 متّجه مكوّن من 4 أعداد صحيحة استخدام عيّنة من البيانات زخرفة ثنائية الأبعاد عيّنة من المحتوى الخارجي نسيج خارجي. لمزيد من المعلومات، راجع ExternalTexture وsetExternalTexture(). - عينات
يمكن أن تحدّد أنواع العينات أيضًا
format
(القيمة التلقائية علىfloat
) وprecision
(القيمة التلقائية علىdefault
). يمكن أن يكون التنسيق واحدًا منint
أوfloat
. يمكن أن تكون الدقة إحدىdefault
(أفضل دقة للنظام الأساسي، وعادةً ما تكونhigh
على كمبيوتر مكتبي،medium
على الأجهزة الجوّالة)،low
،medium
،high
.- الوصف
تسرد المعلمات المطلوبة من خلال المادة الخاصة بك. ويمكن تحديد هذه المعلمات في وقت التشغيل باستخدام Sceneform's. يختلف الوصول إلى المعلمات من التظليلات حسب نوع المعلمة:
- أنواع العيّنات: استخدِم اسم المعلّمة مسبوقًا
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 صالح.
- الوصف
- تحدّد هذه المواد أداة التحوّل المخصّص (أو المتغيّرات) التي يتم الحصول عليها من خلال أداة تظليل المواد. يحدّد كل إدخال للمصفوفة اسم أحد المواد المتداخلة.
تجدر الإشارة إلى أن الاسم الكامل في أداة التظليل هو اسم الفاصل الداخلي مع البادئة
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
. - الوصف
لتحديد كيفية/دمج العنصر المعروض مع محتوى العرض المعروض. في ما يلي أساليب المزج المحتمَلة:
- Opaque: تم إيقاف ميزة المزج، ويتم تجاهل القناة ألفا لإخراج المادة الأساسية.
- شفاف: تم تفعيل المزج. إخراج المادة هو مركّب مركّب مع هدف العرض باستخدام قاعدة Porter-Duff'sover over. يفترض وضع المزج هذا ضرب ألفا مسبقًا.
- التلاشي: يعمل ك
transparent
، ولكن يتم أيضًا تطبيق الشفافية على الإضاءة الفاتحة. في وضعtransparent
، يتم تطبيق قيم ألفا من المادة الأساسية فقط على الإضاءة المتنوعة. ويُعد وضع المزج هذا مفيدًا لتلاشي العناصر المضاءة. - إضافة: يتم تفعيل ميزة الدمج. تتم إضافة مخرجات المواد إلى محتوى هدف العرض.
- مقنَّع: تم إيقاف ميزة المزج. يساعد وضع المزج هذا على إخفاء هوية ألفا. وتحدّد قناة ألفا لإخراج المادة الأساسية ما إذا كان يتم تجاهل جزء معيّن أم لا. يمكنك الاطّلاع على القسم maskThreshold للحصول على مزيد من المعلومات.
material {
blending : transparent
}
نطاق رأسي
- النوع
string
- القيمة
- أي من
object
أوworld
أوview
أوdevice
. القيمة التلقائية هيobject
. - الوصف
تحدّد نطاق الشبكة المتداخلة المعروضة (أو مساحة المساحة). ويؤثر النطاق في كيفية تحويل الرؤوس في مركز التظليل. النطاقات المحتملة هي:
- الكائن: يتم تحديد الرؤوس في إحداثيات الكائن (أو النموذج). يتم تحويل الرؤوس باستخدام مصفوفة التحويل المعروضة.
- العالم: يتم تحديد الرؤوس في مساحة الإحداثيات العالمية. لا يتم تحويل الرؤوس باستخدام كائن العنصر المعروض.
- العرض: يتم تحديد الرؤوس في مساحة العرض (أو العين أو الكاميرا). لا يتم تحويل الزوّار باستخدام كائن العنصر المعروض.
- الجهاز: يتم تحديد الرؤوس في تنسيق إحداثيات الجهاز (أو المقطع). لا يتم تحويل الرؤوس باستخدام كائنات "الكائن" المعروضة.
material {
vertexDomain : device
}
استجواب
- النوع
string
- القيمة
- أي من
smooth
،flat
. القيمة التلقائية هيsmooth
. - الوصف
- تحدّد كيفية إضافة المعلومات الداخلية (أو المتغيرات) بين الرؤوس.
عند ضبط هذه السمة على
smooth
، يتم تنفيذ المنظور الصحيح ضمن كل أداة ضمنية. عند ضبط السياسة علىflat
، لا يتم تنفيذ عملية الاستجواب، ويتم تظليل جميع الأجزاء داخل مثلث معيّن بالطريقة نفسها.
material {
interpolation : flat
}
شَيْء
- النوع
string
- القيمة
- أي من
none
أوfront
أوback
أوfrontAndBack
. القيمة التلقائية هيback
. - الوصف
- يحدد المثلثات التي يجب ضربها: لا شيء مثلثات أمامية ومثلثات خلفية أو الكل.
material {
culling : none
}
Colorwrite
- النوع
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
.- الوصف
- يفعّل العرض على الوجهين أو يوقفه. عند ضبط السياسة على
true
، يتم ضبطculling
تلقائيًا علىnone
. وإذا كان المثلث خلفيًا، يتم تلقائيًا تقليب المثلث إلى أن يكون أمامي.
material {
doubleSided : true
}
الشفافية
- النوع
string
- القيمة
- أي من
default
أوtwoPassesOneSide
أوtwoPassesTwoSides
. ويتم إعداد القيمة تلقائيًا علىdefault
. - الوصف
- يتحكّم هذا الإعداد في كيفية عرض العناصر الشفافة. صالحة فقط عندما يكون وضع
blending
ليسopaque
. ولا يمكن لأي من هذه الطرق عرض الهندسة الهندسية بدقة، ولكن من الناحية العملية، غالبًا ما تكون جيدة.
تتضمن أوضاع الشفافية الثلاثة ما يلي:
default
: يتم عرض العنصر الشفاف بشكل طبيعي، مع الالتزام بوضعculling
وما إلى ذلك.twoPassesOneSide
: يتم عرض العنصر الشفاف أولاً في المخزن المؤقت للعمق، ثم مرة أخرى في المخزن المؤقت للألوان، مع وضع وضعcullling
. ويؤدي هذا إلى عرض نصف العنصر الشفاف فقط بفعالية كما هو موضّح أدناه.twoPassesTwoSides
: يتم عرض العنصر الشفاف مرتين في المخزن المؤقت: أولاً بوجوهه الخلفية، ثم بوجوهه الأمامية. يتيح لك هذا الوضع عرض مجموعتَي الوجوه مع تقليل مشاكل الترتيب أو الحدّ منها، كما هو موضّح أدناه. يمكن الجمع بين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
. إذا تم تفعيل هذه الخاصية، يتم ضرب اللون النهائي الذي تم احتسابه بالمادة في عامل التظليل (أو مستوى الرؤية). يسمح هذا الإجراء بإنشاء كائنات شفافة لاستلام الظل (مثل طائرة أرض غير مرئية في الواقع المعزّز).
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
، يُستخدَم عند توفّر ضوء اتجاهي في المشهد - يُستخدَم عند توفّر إضاءة غير اتجاهية (نقطة أو نقطة أو غير ذلك) في المشهد - تُستخدم عندما يكون العنصر متاحًا بظلال - skinning
، ويُستخدم عندما يكون العنصر متحركًا باستخدام سلاسة وحدة معالجة الرسومات
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 {
requires : [uv0, color]
}
vertex {
void materialVertex(inout MaterialVertexInputs material) {
material.color *= sin(getTime());
material.uv0 *= sin(frameUniforms.time);
}
}
بالإضافة إلى بنية MaterialVertexInputs
، يمكن أن يستخدم رمز تظليل علامة الرأس
جميع واجهات برمجة التطبيقات العامة المُدرجة في القسم
واجهات برمجة تطبيقات Shader العامة.
مدخلات رأس المادة
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
};
جزء مجزأ
يجب استخدام كتلة الأجزاء للتحكم في مرحلة تظليل الجزء
من المادة. يجب أن تحتوي مجموعة الأجزاء على رمز صالح لـ ESSL 3.0 (إصدار GLSL في OpenGL ES 3.0). لديك الحرية في إنشاء دوال متعددة داخل كتلة الرأس، ولكن يجب تحديد دالة material
:
fragment {
void material(inout MaterialInputs material) {
prepareMaterial(material);
// fragment shading code
}
}
يستدعي نظام التظليل هذه الدالة تلقائيًا في وقت التشغيل
ويمنحك إمكانية قراءة خصائص المادة وتعديلها باستخدام
البنية MaterialInputs
. يمكن العثور على التعريف الكامل للبنية في قسم "إدخالات أجزاء المادة". يمكن العثور على التعريف الكامل للأعضاء المختلفين في البنية في قسم النماذج الأساسية في هذا المستند.
الهدف من الدالة 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
الحالة
الداخلية لنموذج المادة. ولا يمكن الوصول إلى بعض واجهات برمجة التطبيقات الموضّحة في قسم Fragment APIs، مثل 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)
}
واجهات برمجة التطبيقات العامة للتظليل
الأنواع
على الرغم من إمكانية استخدام أنواع GLSL مباشرةً (vec4
أو mat4
)، إلا أننا ننصح باستخدام الأسماء المستعارة التالية:
الاسم | نوع GLSL | الوصف |
---|---|---|
Bool2 | bvec2 | متّصل من قيمتَين |
Bool3 | Bvec3 | متّجه مكوّن من 3 قيم منطقية |
Bool4 | bvec4 | متّجه مكوّن من 4 قيم منطقية |
int2 | ivec2 | متّجه مكوّن من عددين صحيحين |
int3 | ivec3 | متّجه مكوّن من 3 أرقام صحيحة |
int4 | ivec4 | متّجه مكوّن من 4 أعداد صحيحة |
uint2 | uvec2 | متّجه مكوّن من عددين صحيحين غير موقّعين |
uint3 | uvc3 | متّجه مكوّن من 3 أعداد صحيحة غير موقَّعة |
uint4 | uvc4 | متّجه مكوّن من 4 أعداد صحيحة غير موقّعة |
عائم2 | قيمة عائمة2 | متّجه مكوّن من عائمين |
العائم | قيمة عائمة3 | متّجه مؤلف من 3 عوامات |
عائم | قيمة عائمة4 | متّجه مكوّن من 4 عوامات |
عائمة4×4 | حصاة 4 | مصفوفة عائمة بحجم 4×4 |
العائم 3×3 | حصالة 3 | مصفوفة عائمة مقاس 3×3 |
رياضيات
الاسم | النوع | الوصف |
---|---|---|
PI | عدد عائم | ثابت يمثّل \(\pi\) |
HALF_PI | عدد عائم | ثابت يمثّل \(\frac{\pi}{2}\) |
التشبّع(عائم x) | عدد عائم | تثبيت القيمة المحدّدة بين 0.0 و1.0 |
pow5(العائم x) | عدد عائم | الحوسبة \(x^5\) |
sq(Flox x) | عدد عائم | الحوسبة \(x^2\) |
max3(Flo3 v) | عدد عائم | لعرض الحد الأقصى لقيمة
float3 المحدّدة |
mulMat4x4Float3(Flo4x4 m, Flo3 v) | قيمة عائمة4 | المرتجعات \(m * v\) |
mulMat3x3Float3(Flo4x4 m, Flo3 v) | قيمة عائمة4 | المرتجعات \(m * v\) |
المصفوفات
الاسم | النوع | الوصف |
---|---|---|
getViewFromWorldMatrix() | عائمة4×4 | المصفوفة التي تحوّل من الفضاء في العالم إلى مساحة العرض/العين |
getWorldFromViewMatrix() | عائمة4×4 | المصفوفة التي تحوّل من مساحة العرض/العين إلى مساحة حول العالم |
getClipFromViewMatrix() | عائمة4×4 | المصفوفة التي يتم تحويلها من مساحة العرض/العين إلى مساحة (NDC) المقطع |
getViewFromClipMatrix() | عائمة4×4 | المصفوفة التي تحوّل من مساحة المقطع (NDC) إلى مساحة العرض/العين |
getClipFromWorldMatrix() | عائمة4×4 | المصفوفة التي تتحول من العالم إلى المقطع (NDC) |
ثوابت في الإطار
الاسم | النوع | الوصف |
---|---|---|
get استراتيجية() | قيمة عائمة4 | درجة دقة العرض بالبكسل: width وheight و1 / width و1 / height |
getWorldCameraPosition() | قيمة عائمة3 | موضع الكاميرا/العين في الفضاء العالمي |
getTime() | عدد عائم | الوقت بالثواني منذ بدء تشغيل محرك Sceneform، وقد تتم إعادة ضبطه بانتظام لتجنّب فقدان الدقة. |
getExposure() | عدد عائم | التعرُّض التصويري للكاميرا |
getEV100() | عدد عائم | قيمة التعرض للضوء عند معيار ISO 100 للكاميرا |
Vertex فقط
لا تتوفّر واجهات برمجة التطبيقات التالية إلا من خلال قسم الرأس:
الاسم | النوع | الوصف |
---|---|---|
getPosition() | قيمة عائمة4 | موضع Vertex في النطاق المحدّد من خلال المادة (التلقائية: كائن/مساحة الطراز) |
getWorldFromModelMatrix() | عائمة4×4 | المصفوفة التي تتحول من مساحة النموذج (الكائن) إلى المساحة العالمية |
getWorldFromModelnormalMatrix() | عائم 3×3 | المصفوفة التي تحوّل القيم الطبيعية من النموذج (الكائن) إلى الفضاء على الفضاء |
جزء فقط
تتوفر واجهات برمجة التطبيقات التالية فقط من كتلة الأجزاء:
الاسم | النوع | الوصف |
---|---|---|
getWorldTangentFrame() | عائم 3×3 | مصفوفة تحتوي على كل عمود
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() ) |
getColor() | قيمة عائمة4 | لون مجزأ للجزء، إذا كانت سمة اللون مطلوبة |
getUV0() | قيمة عائمة2 | أول مجموعة من إحداثيات الأشعة فوق البنفسجية، إذا كانت السمة uv0 مطلوبة |
getUV1() | قيمة عائمة2 | المجموعة الأولى من إحداثيات الأشعة فوق البنفسجية، إذا كانت السمة uv1 مطلوبة |
inآليةTonemap(Flo3) | قيمة عائمة3 | يتم تطبيق عامل تشغيل تعيين الدرجات المعكوسة على لون sRGB الخطي المحدّد. قد تكون هذه العملية تقريبية |
inآليةTonemapSRGB(عائم3) | قيمة عائمة3 | تطبيق عامل تشغيل تعيين الدرجات المعكوسة على لون SRGB غير خطي محدد. قد تكون هذه العملية تقريبية |
السطوع(العائم3) | عدد عائم | لاحتساب إضاءة الخط SRGB الخطي المحدّد |
نماذج المواد
يمكن أن تستخدم مواد العرض أحد نماذج المواد التالية:
- ليت (أو عادي)
- قماش
- غير مضاء
نموذج Lit
النموذج المضاء هو نموذج مواد نموذجية للمشهد. تم تصميم نموذج التظليل القائم على أساس مادي لتوفير إمكانية التشغيل التفاعلي بشكل جيد مع الأدوات والمحركات الشائعة الأخرى مثل Unity 5 أو Unreal Engine 4 أو مصمّم المواد أو حقيبة أدوات Marmoset.
يمكن استخدام هذا النموذج المتعدد الأبعاد لوصف عدد كبير من الأسطح غير المعدنية (الكهرباء) أو الأسطح المعدنية (الموصّلات).
ويتم التحكم في مظهر المادة التي تستخدم النموذج العادي باستخدام السمات الموضحة في الجدول أدناه.
سمات النموذج العادي
الخاصية | التعريف |
---|---|
basecolor | تُخفّض ألوان الأسطح غير المعدنية وتُشكّل ألوانًا مختلفة. |
معدن | ما إذا كان السطح يبدو عازلاً للكهرباء (0.0) أو موصلًا (1.0) غالبًا ما تُستخدم كقيمة ثنائية (0 أو 1) |
درجة صعوبة الاستخدام | مظهر ناعم (1.0) أو خشنة (0.0) للسطح. أسطح ناعمة تُظهر انعكاسات حادة |
انعكاس | انعكاس أيقونة عند وقوعها في الأسطح الكهربائية العادية. يتحكّم هذا الإجراء مباشرةً في قوة الانعكاسات. |
ClearCoat | قوة طبقة المعاطف الشفافة |
clearCoatRoughness | نعومة أو خشنة طبقة الطبقة المعطفة |
تساوي الخواص | كمية الخواص الخبيثة إما في اتجاه ظل الزاوية أو الظل |
anisotropyDirection | اتجاه السطح المحلي |
صفحات AMP | يحدِّد هذا الإعداد نسبة الضوء المحيط الذي يمكن الوصول إليه إلى نقطة في السطح. وهو عامل تظليل لكل بكسل بين 0.0 و1.0 |
عادي | تفاصيل عادية تُستخدم للتحرك على السطح باستخدام الربط السريع (الربط العادي) |
clearCoat منتزه | تفاصيل عادية تُستخدَم لتوفير طبقة طبقة واضحة من خلال تحديد الارتفاع (الربط العادي) |
انتهازية | تزيد أعمال Albedo منتشرة لمحاكاة الأسطح المبهمة (مثل النيون، وما إلى ذلك) وهذه الخاصية تكون مفيدة في الغالب في مسار النطاق العالي الديناميكية مع بطاقة تفتُّح الأزهار. |
يوضح الجدول أدناه نوع كل موقع إلكتروني ونطاقه.
الخاصية | النوع | النطاق | ملاحظة |
---|---|---|---|
basecolor | قيمة عائمة4 | [0.1] | الضرب الخطي مسبقًا RGB |
معدن | عدد عائم | [0.1] | يجب أن تكون القيمة 0 أو 1 |
درجة صعوبة الاستخدام | عدد عائم | [0.1] | |
انعكاس | عدد عائم | [0.1] | تفضيل القيم >؛ 0.35 |
ClearCoat | عدد عائم | [0.1] | يجب أن تكون القيمة 0 أو 1 |
clearCoatRoughness | عدد عائم | [0.1] | إعادة الربط بـ [0.0.0.6] |
تساوي الخواص | عدد عائم | [-1.1] | تكون علم الخواص في الاتجاه الرأسي عندما تكون هذه القيمة موجبة |
anisotropyDirection | قيمة عائمة3 | [0.1] | تعمل تقنية RGB الخطية على ترميز متّجه اتجاهي في مساحة ظل الزاوية |
صفحات AMP | عدد عائم | [0.1] | |
عادي | قيمة عائمة3 | [0.1] | تعمل تقنية RGB الخطية على ترميز متّجه اتجاهي في مساحة ظل الزاوية |
clearCoat منتزه | قيمة عائمة3 | [0.1] | تعمل تقنية RGB الخطية على ترميز متّجه اتجاهي في مساحة ظل الزاوية |
انتهازية | قيمة عائمة4 | RSS=[0.1], a=[-n.n] | ألفا هي مكافح التعرض للضوء |
اللون الأساسي
تحدّد السمة baseColor
اللون المتصوّر لكائن (يُسمّى أحيانًا Albedo). يعتمد تأثير baseColor
على طبيعة السطح،
التي يتم التحكّم فيها من خلال السمة metallic
الموضّحة في قسم الميتال.
- مواد غير معدنية (مواد كهربائية)
لتعريف اللون المتباين للسطح يمكن عادةً العثور على القيم الفعلية في النطاق [10.240] إذا كانت القيمة مرمَّزة بين 0 و255، أو في النطاق [0.04.0.94] بين 0 و1. في الجدول أدناه يمكنك العثور على أمثلة للألوان الأساسية للأسطح غير المعدنية.
موسيقى ميتال بروتوكول sRGB سداسي عشري اللون بالفحم 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 Brick 0.58، 0.49، 0.46 #947d75 رمل 0.69، 0.66، 0.52 #b1a884 Concrete 0.75، 0.75، 0.73 #c0bfbb - المعادن (الموصلات)
لتعريف اللون المُفصَّل للسطح. يمكن العثور على القيم الفعلية في النطاق [170.255] إذا كانت القيمة مرمّزة بين 0 و255، أو في النطاق [0.66.1.0] بين 0 و1. يمكن العثور على العديد من أمثلة الألوان الأساسية للأسطح المعدنية في الجدول أدناه.
موسيقى ميتال بروتوكول sRGB سداسي عشري اللون المستوى الفضّي 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 البلاتيني 0.84، 0.82، 0.79 #d6d1c8 المستوى الذهبي 1.00، 0.87، 0.62 #fedc9d براس 0.96، 0.89، 0.68 #f4e4ad Copper 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
لوصف المواد باستخدام طبقتَين. ستكون طبقة المعطف الشفاف دائمًا متباينة الخواص والكهرباء. تقارِن الصورة التالية مادة مصنوعة من الألياف الكربونية ضمن نموذج المادة العادية (على اليسار) ونموذج المعاطف الشفاف (على اليمين).
تتحكّم السمة 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 تشير إلى خارج السطح.
على سبيل المثال، لِنفترض أنّنا نريد عرض قطعة أثاث مغطاة بالجلد المبطّن. نشير إلى أنّ تصميم الرسومات الهندسية لتمثيل الأنماط المبطّنة بدقة سيتطلب الكثير من المثلثات، لذا بدلاً من ذلك نصنع شبكة مضلعة عالية الدقة في خريطة عادية. ويمكنك بعد ذلك تطبيق الخريطة الأساسية على شبكة مبسّطة. تقارن الصورة التالية شبكة بسيطة بدون ربط عادي (على اليسار) ومعها ((لليمين).
ملاحظة: تؤثر السمة normal
في الطبقة الأساسية وليس في طبقة الطبقة المعطفة.
محو المعطف العادي
تحدّد السمة clearCoatNormal
طبيعة طبقة الطبقة المعطّلة في نقطة معيّنة. إنه يعمل بشكل آخر بخلاف السمة normal
.
انبعاثي
يمكن استخدام الخاصية emissive
لمحاكاة الضوء الإضافي الذي ينبعث من
السطح. يتم تعريفه على أنّه قيمة float4
تحتوي على لون أحمر أخضر أزرق (في المسافة الخطية) بالإضافة إلى قيمة للتعويض عن التعرّض للضوء (في قناة ألفا).
على الرغم من أن قيمة التعرّض تشير إلى تركيبات من إعدادات الكاميرا، فإنها تستخدمها غالبًا من قبل المصوّرين لوصف كثافة الإضاءة. ولهذا السبب، تتيح الكاميرات للمصوّرين تطبيق تعويض تعرّض للضوء على صورة أو تعريضها بشكلٍ مفرط. ويمكن استخدام هذا الإعداد لأغراض التحكم الفني ولكن أيضًا لتحقيق التعرّض المناسب (على سبيل المثال، سيتم الكشف عن الثلج بنسبة 18% رمادي متوسط).
يمكن استخدام قيمة تعويض التعرّض للخاصية الانبعاثية لفرض لون الانبعاثات يكون أكثر سطوعًا (القيم الموجبة) أو أغمق (القيم السلبية) من التعرض الحالي. إذا تم تفعيل تأثير التوهج، يمكن أن يؤدي استخدام تعويض التعرّض لفيروس كورونا إلى فرض تفتيت الأسطح.
نموذج قماش
تم تصميم جميع النماذج الأساسية الموضّحة سابقًا لمحاكاة الأسطح الكثيفة، سواء على مستوى الماكرو أو على مستوى المايكرو. ومع ذلك، غالبًا ما تكون الملابس والأقمشة مصنوعة من خيوط متّصلة بشكلٍ صاخب تمتص الإضاءة المتطايرة. مقارنةً بالأسطح الصلبة، تتميّز قطعة القماش بإلصاق خافت أكثر نعومة مع سقوط كبير وإضاءة ضبابية، ناتجة عن التشتيت للأمام/الخلف. وتعرض بعض الأقمشة أيضًا ألوانًا ثنائية الألوان وسطى. (المخمليات على سبيل المثال).
تُقارن الصورة التالية قماش الدنيم المعروض باستخدام النموذج العادي (على اليسار) وطراز القماش (على اليمين). لاحِظ كيف يخفق نموذج المادة العادية في التقاط مظهر لقطعة قماش دنيم (يسار). يظهر السطح صلبًا (شبه بلاستيكي تقريبًا)، ويشبه أكثر من قماشًا مقارنةً بقطعة الملابس. ويوضّح هذا أيضًا مدى أهمية فصّ التوهج المعقّد الذي ينجم عن الامتصاص والنقاط المبعثرة إلى استرخاء الأقمشة في الأساس.
Velvet هي حالة استخدام مثيرة للاهتمام لطراز مادة من القماش. كما هو موضّح في الصورة أدناه، يشير هذا النوع من القماش إلى إضاءة قوية للإطارات لأنّه يتم تطبيق التبعثر للأمام والخلف. تنتج هذه الأحداث المبعثرة عن ألياف ثابتة مباشرة على سطح القماش. عندما يأتي ضوء الحوادث من الاتجاه المعاكس لاتجاهات العرض، ستعمل الألياف على إعادة توجيه الضوء. وبالمثل، عندما يقع ضوء الحادث من اتجاه واحد مثل اتجاه العرض، ستعمل الألياف على توزيع الضوء للخلف.
تجدُر الإشارة إلى أنّ هناك أنواع أقمشة لا تزال مُصمَّمة على أفضل نحو باستخدام نماذج من المواد الصلبة. على سبيل المثال، يمكن إعادة صنع الجلود والحرير والحرير باستخدام نماذج المواد العادية أو المتباينة الخواص.
ويشمل نموذج مواد القماش جميع المعلّمات التي تم تحديدها سابقًا لوضع المواد القياسية باستثناء المعادن والانعكاس. يتوفر أيضًا معلَمتان إضافيتان موضّحتان في الجدول أدناه.
المعلمة | التعريف |
---|---|
اللمعان | درجات ألوان متعددة لإنشاء أقمشة بدرجات ألوان ثنائية (الإعداد التلقائي على \(\sqrt{baseColor}\)) |
subsurfacecolor | تلوين اللون بعد انتشاره وامتصاصه للمواد المختلفة |
يوضح الجدول أدناه نوع كل موقع إلكتروني ونطاقه.
الخاصية | النوع | النطاق | ملاحظة |
---|---|---|---|
اللمعان | قيمة عائمة3 | [0.1] | نموذج أحمر أخضر أزرق خطي |
subsurfacecolor | قيمة عائمة3 | [0.1] | نموذج أحمر أخضر أزرق خطي |
للحصول على المادة الأساسية المخملية، يمكن ضبط اللون الأساسي على اللون الأسود (أو لون داكن). يجب تحديد معلومات اللون بدلاً من ذلك على لون الظل. لإنشاء أقمشة أكثر شيوعًا، مثل الدنيم والقطن وما إلى ذلك، استخدِم اللون الأساسي للألوان.
لون اللمعان
يمكن استخدام السمة sheenColor
لتعديل الانعكاس المخبّر مباشرةً. وهو يتيح إمكانية التحكّم بشكل أفضل في مظهر
القماش، كما يمنح الجهاز إمكانية صنع مواد ثنائية اللون.
تقارِن الصورة التالية قماشًا أزرق مع خطين (على اليسار) وأسفلهما (مع) (على اليمين) (انقر على الصورة لمشاهدة نسخة أكبر).
لون سطح الأرض
لا تستند سمة subsurfaceColor
إلى أساس يمكن استخدامها فعليًا لمحاكاة التبعثر، والامتصاص الجزئي، وإعادة إضاءة الضوء في بعض أنواع الأقمشة. ويُعدّ هذا أمرًا مفيدًا على وجه الخصوص لإنشاء أقمشة ناعمة.
توضّح الصورة التالية تأثير subsurfaceColor
. وهو يعرض قماشًا أبيض اللون (العمود الأيسر) في مقابل قطعة قماش بيضاء مع تقصير تحت سطح بني (العمود الأيمن). انقر على الصورة لمشاهدة نسخة أكبر منها.
نموذج غير مضاء
يمكن استخدام نموذج المواد غير المضاءة لإيقاف جميع العمليات الحسابية المتعلقة بالإضاءة. والغرض الأساسي منه هو عرض عناصر مضاءة مسبقًا مثل مكعّب أو محتوى خارجي (مثل فيديو أو بث كاميرا) وواجهات المستخدم والمرئيات/تصحيح الأخطاء وما إلى ذلك. ولا يعرض النموذج غير المضاء أيًا من الخصائص التي تم توضيحها في الجدول أدناه.
الخاصية | التعريف |
---|---|
basecolor | لون انتشار السطح |
انتهازية | لون إضافي موزّع لمحاكاة الأسطح العاكسة وتكون هذه الخاصية مفيدة بشكل كبير في تدفق النطاق العالي الديناميكية مع إمكانية التفتيش. |
يوضح الجدول أدناه نوع كل موقع إلكتروني ونطاقه.
الخاصية | النوع | النطاق | ملاحظة |
---|---|---|---|
basecolor | قيمة عائمة4 | [0.1] | الضرب الخطي مسبقًا RGB |
انتهازية | قيمة عائمة4 | RSS=[0.1], a=N/A | تم ضرب RGB الخطي مسبقًا، ويتم تجاهل الإصدار الأولي. |
وتتم إضافة قيمة emissive
إلى baseColor
عند وجودها. والغرض الرئيسي من استخدام emissive
هو فرض توهج أي سطح غير مضاء إذا تم ضبط مسار النطاق العالي الديناميكية
باستخدام بطاقة زهرة.
توضّح الصورة التالية مثالاً عن نموذج المواد غير المضاءة المُستخدَم لعرض معلومات تصحيح الأخطاء (انقر على الصورة للاطّلاع على نسخة أكبر منها).
التعامل مع الألوان
الألوان الخطية
إذا كانت بيانات الألوان تأتي من زخرفة، ما عليك سوى استخدام زخرفة 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، سيتم تلقائيًا ضرب أي نسيج تم تحميله من Bitmap.