مرجع المادة المخصّصة

يوفّر 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&#39s. يختلف الوصول إلى المعلمات من التظليلات حسب نوع المعلمة:

  • أنواع العيّنات: استخدِم اسم المعلّمة مسبوقًا 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] تفضيل القيم &gt؛ 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.