חומר עזר בהתאמה אישית

ב-Squareform מספקת הגדרות ברירת מחדל לחומרים (.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 ללא בריחה (escape), שאינו חוקי ב-JSON.

מותר להוסיף תגובות בסגנון C++ בשורה אחת.

המפתח של זוג הוא תלוי אותיות רישיות.

הערך של זוג אינו תלוי אותיות רישיות.

דוגמה

רשומת הקוד הבאה מציגה דוגמה להגדרת תוכן חוקית. ההגדרה הזו משתמשת במודל המואר, המאופיין במצב ברירת המחדל של תערובת, דורש שקבוצה של קואורדינטות UV תוצג ברשת המעובדת ותגדיר 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 וקטור של 2 בוליאניים
בוליאני 3 וקטור של 3 בוליאניים
בוליאני 4 וקטור של 4 בוליאניים
מספר ממשי (float) מספר ממשי (float)
לצוף 2 וקטור של 2 צף
לצוף 3 וקטור של 3 צף
לצוף 4 וקטור של 4 צף
int מספר שלם יחיד
int2 וקטור של שני מספרים שלמים
int3 וקטור של 3 מספרים שלמים
int4 וקטור של 4 מספרים שלמים
דוגם2 מרקם דו-ממדי
דוגם חיצוני מרקם חיצוני. למידע נוסף, ראו ExternalTexture ו-setExternalTexture()
דוגמיות

סוגי דוגמאות יכולים גם לציין format (ברירת המחדל היא float) ו-precision (ברירת המחדל היא default). הפורמט יכול להיות אחד מ-int, float. רמת הדיוק יכולה להיות אחת מהאפשרויות הבאות: default (הדיוק הטוב ביותר בפלטפורמה, בדרך כלל high במחשב, medium בנייד), low, medium, high.

תיאור

הפרמטרים הנדרשים עבור החומר שלכם. ניתן להגדיר את הפרמטרים האלה בזמן ריצה באמצעות ממשק ה-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 תקף.
תיאור
ההגדרה של אינטרפולנסים (או משתנים) מותאמים אישית שפלט הפלט של חומר ההתממשות הוא שלהם. כל ערך של מערך מגדיר את השם של אינטרפולנט. השם המלא של תוכנת הצללה שבר הוא שם המתווך עם הקידומת 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.
תיאור

מגדירה איך, או אם האובייקט המשולב מעובד עם התוכן של יעד הרינדור. אלה הסוגים האפשריים של שילוב:

  • אטום: המיזוג מושבת. המערכת מתעלמת מערוץ האלפא של החומרים.
  • שקוף: השילוב מופעל. הפלט של החומר עשוי להיות מורכב מאלפא ויעד, באמצעות כלל Porter-Duff&39.מקור:. במצב שילוב זה ההנחה היא אלפא מוכפלת.
  • עמעום: פועל כ-transparent אבל השקיפות חלה גם על תאורה ספקולטיבית. במצב transparent, ערכי האלפא של החומר חלים רק על תאורה מכוונת. מצב השילוב הזה מאפשר לעמעום אובייקטים מוארים פנימה ומחוץ להם.
  • הוספה: השילוב מופעל. הפלט של החומר מתווסף לתוכן של יעד העיבוד.
  • מסכה: השילוב מושבת. מצב השילוב הזה מאפשר מסכת אלפא. ערוץ האלפא של החומר שממנו מתבצעת הפלט מציין אם הקטע נמחק או לא. מידע נוסף מפורט בקטע המסכה.
material {
    blending : transparent
}

דומיין vertexDomain

סוג
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
}

צבע כתיבה

סוג
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. אם המאפיין הזה מופעל, הצבע הסופי שמחושב על ידי החומר מוכפל בגורם הצללית (או בחשיפה). כך ניתן ליצור אובייקטים שקופים לקבלת צללית (למשל, מטוס קרקעי בלתי נראה ב-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.
תיאור
משמשות לציון רשימה של וריאנטים של תוכנות הצללה (sshader) שלא מובטח כי האפליקציה לא תצטרך אותם אף פעם. המערכת תדלג על גרסאות הצללה האלה בשלב יצירת הקוד, ותקטין את הגודל הכולל של החומר. שימו לב: יכול להיות שחלק מהווריאציות יסוננו באופן אוטומטי. לדוגמה, כל הווריאציות שקשורות לתאורה (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. הגדרה מלאה של המבנה נמצאת בקטע קלט קודקודים של חומר.

תוכלו להשתמש במבנה הזה כדי לחשב את המשתנים המותאמים אישית/מחלפים או לשנות את הערך של המאפיינים. לדוגמה, בלוקי הקודקוד הבאים משנים את הצבע וגם את הקואורדינטות של קרינת UV לאורך הזמן:

material {
    requires : [uv0, color]
}
vertex {
    void materialVertex(inout MaterialVertexInputs material) {
        material.color *= sin(getTime());
        material.uv0 *= sin(frameUniforms.time);
    }
}

בנוסף למבנה של MaterialVertexInputs, קוד הצללה של הקודקוד שלך יכול להשתמש בכל ממשקי ה-API הרשומים בקטע ממשקי API ציבוריים של 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 מגדירה את המצב הפנימי של מודל החומר. ניתן לגשת לחלק מממשקי ה-API המתוארים בקטע 'ממשקי 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 ציבוריים של Shader

סוגים

ניתן להשתמש בסוגי GLSL ישירות (vec4 או mat4) אבל מומלץ להשתמש בכינויים מהסוגים הבאים:

שם סוג GLSL תיאור
bool2 bvec2 וקטור של 2 בוליאניים
bool3 bvec3 וקטור של 3 בוליאניים
bool4 bvec4 וקטור של 4 בוליאניים
int2 C22 וקטור של שני מספרים שלמים
int3 Civ33 וקטור של 3 מספרים שלמים
int4 ארבע וקטור של 4 מספרים שלמים
uint2 u2c וקטור של שני מספרים שלמים לא חתומים
uint3 Uuc3 וקטור של 3 מספרים שלמים לא חתומים
uint4 Uuc4 וקטור של 4 מספרים שלמים לא חתומים
float2 לצוף 2 וקטור של 2 צף
מספר ממשי (float) לצוף 3 וקטור של 3 צף
מספר ממשי (float) לצוף 4 וקטור של 4 צף
float4x4 mat4 מטריצה צפה בגודל 4x4
float3x3 Mat3 מטריצת צף בגודל 3x3

מתמטיקה

שם סוג תיאור
תמונה בתוך תמונה (PI) מספר ממשי (float) קבוע שמייצג \(\pi\)
HALF_PI מספר ממשי (float) קבוע שמייצג את\(\frac{\pi}{2}\)
saturate(float x) מספר ממשי (float) חיתוך הערך שצוין בין 0.0 ל-1.0
pow5(float x) מספר ממשי (float) מחשבים \(x^5\)
sq(float x) מספר ממשי (float) מחשבים \(x^2\)
max3(float3 v) מספר ממשי (float) פונקציה זו מחזירה את הערך המקסימלי של float3 שצוין
mulMat4x4Float3(float4x4 m, float3 v) לצוף 4 החזרות \(m * v\)
mulMat3x3Float3(float4x4 m, float3 v) לצוף 4 החזרות \(m * v\)

מטריצות

שם סוג תיאור
getViewFromWorldMatrix() לצוף 4x4 מטריצה שעוברת ממרחב משותף לעולם של צפייה/עין
getWorldFromViewMatrix() לצוף 4x4 מטריצה שעוברת המרה ממרחב לצפייה/עין למרחב עולמי
getClipFromViewMatrix() לצוף 4x4 מטריצת המרה שהופכת ממרחב צפייה/עין למרחב קליפ (NDC)
getViewFromClipMatrix() לצוף 4x4 מטריצת המרה שממירה משטח קליפ (NDC) למרחב עם תצוגה/עין
getClipFromWorldMatrix() לצוף 4x4 מטריצה שממירה מהעולם לקליפ (NDC)

קבועים של מסגרת

שם סוג תיאור
getResolution() לצוף 4 רזולוציית התצוגה בפיקסלים: width, height, 1 / width, 1 / height
getWorldCameraLocation() לצוף 3 המיקום של המצלמה/עין במרחב המשותף
getTime() מספר ממשי (float) הזמן בשניות מאז שמנוע ה-Squareform הופעל, ייתכן שהוא יאופס באופן קבוע כדי למנוע אובדן דיוק
getExposure() מספר ממשי (float) חשיפה פוטומטרית של המצלמה
getEV100() מספר ממשי (float) ערך החשיפה בתקן ISO 100

Vertex בלבד

ממשקי ה-API הבאים זמינים רק מבלוק vertex:

שם סוג תיאור
getposition() לצוף 4 מיקום הקרקע בדומיין שהוגדר על ידי החומר (ברירת מחדל: חלל אובייקט/מודל)
getWorldFromModelMatrix() לצוף 4x4 מטריצה שעוברת מהמרה של דגם (אובייקט) למרחב משותף בעולם
getWorldFromModelnormalMatrix() מספר ממשי (float) 3x3 מטריצה שממירה נורמליות ממודל (אובייקט) למרחב בעולם

מקטעים בלבד

ממשקי ה-API הבאים זמינים רק מקטע הקוד:

שם סוג תיאור
getWorldTangentFrame() מספר ממשי (float) 3x3 המטריצה מכילה בכל עמודה את ה-tangent (frame[0]), bi-tangent (frame[1]) ו-normal (frame[2]) בקודד במרחב המשותף. אם החומר לא יחושב רווח נורמלי במיפוי Bump או אם הצללה לא אניסוטרופית, רק normal יהיה חוקי במטריצה הזו.
getWorldLocation() לצוף 3 מיקום המקטע במרחב המשותף
getWorldViewVector() לצוף 3 וקטור מנורמל במרחב המשותף ממיקום מקוטע לעין
getWorldnormalVector() לצוף 3 נורמליזציה במרחב המשותף, אחרי מיפוי נקודת מבט (יש להשתמש אחרי התאריך prepareMaterial())
getWorldReflectedVector() לצוף 3 השתקפות של וקטור התצוגה לרגיל (יש להשתמש בו אחרי prepareMaterial())
getNdotV() מספר ממשי (float) התוצאה של dot(normal, view), תמיד גדולה יותר מ-0 (חובה להשתמש אחרי prepareMaterial())
getcolor() לצוף 4 צבע אינטרפולציה של הקטע, אם מאפיין הצבע נדרש
getUV0() לצוף 2 קבוצה ראשונה של אינטרפולציה
getUV1() לצוף 2 קבוצה ראשונה של אינטרפולציה של UV, אם נדרש מאפיין uv1
inverseTonemap(float3) לצוף 3 רלוונטי את האופרטור להיפוך גוון ההיפוך לצבע ה-SRGB הלינארי שצוין. פעולה זו עשויה להיות הערכה
inverseTonemapSRGB(float3) לצוף 3 רלוונטי את האופרטור למיפוי גוון ההיפוך לצבע ה-SRGB שאינו לינארי שצוין. פעולה זו עשויה להיות משוערת
luminance(float3) מספר ממשי (float) מחשבת את העוצמה של צבע ה-sRGB הלינארי שצוין

דגמי חומרים

חומרים המבוססים על נוף יכולים להשתמש באחד מהדגמים הבאים:

  • Lite (או רגיל)
  • אריג
  • לא מואר

מודל Lite

המודל המואר הוא מודל החומר הסטנדרטי של schema. מודל ההצללה הזה מבוסס על מבנה פיזי, ובו הציעו יכולת פעולה הדדית טובה עם כלים ומנועים נפוצים אחרים, כמו Unity 5, Unreal Engine 4, מעצב חומרים או ארגז כלים של Marmoset.

ניתן להשתמש במודל החומר הזה כדי לתאר מספר רב של משטחים שאינם מתכתיים (מוצרי חשמל) או משטחים ממתכת (מוליכים).

המראה של חומר באמצעות המודל הרגיל נשלט על ידי שימוש במאפיינים המתוארים בטבלה הבאה.

מאפייני המודל הרגיל

מאפיין (property) הגדרה
basecolor דיבידו אלבדו למשטחים שאינם מתכתיים, וצבע ספקולטיבי למשטחים מתכתיים
מתכתי אם משטח נראה "דיאלקטי" (0.0) או מוליכים (1.0). לרוב משתמשים כערך בינארי (0 או 1)
גסות חלקות (1.0) או ברוטו (0.0) של משטח. משטחים חלקים מציגים השתקפויות חדות
השתקפות השתקפות כהים בתדירות גבוהה עבור משטחים דיאלקטיים. כך אפשר לשלוט ישירות בעוצמת ההשתקפות
ClearCoat עוצמת שכבת השכבת הצלולה
clearCoatRoughness נראים בצורה חלקה או גסות של שכבת שכבת-העל הצלולה
אניזוטרופיה כמות האניזוטרופיה בכיוון הטנגנס או בכיוון הטנגנס
anisotropyDirection פני השטח המקומיים
אמביינטוס ההגדרה קובעת איזה חלק מהתאורה בסביבה נגיש לנקודת מבט. זהו גורם צללית לכל פיקסל בין 0.0 ל-1.0
רגילה פרט רגיל שמשמש לעיצוב פני השטח באמצעות מיפוי Bump (מיפוי רגיל)
clearCoatnormal פירוט רגיל המשמש לשיבוש של שכבת מעילים ברורה באמצעות מיפוי Bump (מיפוי רגיל)
איטי דיפיו אלבדו נוסף כדי לדמות משטחי הדמיה (כגון נאון וכו') הנכס הזה שימושי בעיקר בצינור HDR עם כרטיס לפריחה

הסוג והטווח של כל נכס מתוארים בטבלה הבאה.

מאפיין (property) סוג טווח הערה
basecolor לצוף 4 [0..1] RGB לינארי מוכפל
מתכתי מספר ממשי (float) [0..1] צריך להיות 0 או 1
גסות מספר ממשי (float) [0..1]
השתקפות מספר ממשי (float) [0..1] עדיפות לערכים > 0.35
ClearCoat מספר ממשי (float) [0..1] צריך להיות 0 או 1
clearCoatRoughness מספר ממשי (float) [0..1] מיפוי מחדש ל-[0..0.6]
אניזוטרופיה מספר ממשי (float) [-1..1] האניזוטרופיה בכיוון הנכון כשהערך הזה חיובי
anisotropyDirection לצוף 3 [0..1] RGB לינארי, מקודד וקטור כיוון במרחב טנגנס
אמביינטוס מספר ממשי (float) [0..1]
רגילה לצוף 3 [0..1] RGB לינארי, מקודד וקטור כיוון במרחב טנגנס
clearCoatnormal לצוף 3 [0..1] RGB לינארי, מקודד וקטור כיוון במרחב טנגנס
איטי לצוף 4 JPEG=[0..1], a=[-n..n] אלפא היא תשלום החשיפה

צבע בסיס

המאפיין baseColor מגדיר את הצבע הנתפס של אובייקט (לפעמים נקרא Albedo). ההשפעה של baseColor תלויה באופי של המשטח, שנשלט על ידי הנכס metallic שמוסבר בקטע תמיכת 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 הקסדצימליים צבע
Silver 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 כדי לתאר חומרים עם שתי שכבות. שכבת המעיל הצלולה תהיה תמיד איזוטרית ודיאלקטית. התמונה הבאה משווה בין חומר פחמן לפי מודל החומר הרגיל (מצד שמאל) לבין מודל הציפוי הבהיר (ימין).

המאפיין clearCoat שולט בחוזק שכבת השכבת הצלולה. לכן צריך להתייחס לערך בינארי בתור 0 או 1. הערכים האמצעיים עוזרים לשלוט במעברים בין משטחים עם שכבות כיסוי ברורות וחלקים שאין להם.

ההשפעה של clearCoat על מתכות גסות מוצגת בהמשך (יש ללחוץ על התמונה כדי לראות גרסה גדולה יותר).

צבע מעיל בהיר

הנכס clearCoatRoughness דומה לנכס roughness אבל הוא רלוונטי רק לשכבת המעיל הצלולה. בנוסף, שכבות שכבות ברורות אף פעם לא גסות כלל, ולכן הערך בין 0 ל-1 ממופה פנימית מחדש לגסות בפועל של 0 עד 0.6.

ההשפעה של clearCoatRoughness על מתכות גסות מוצגת בהמשך (יש ללחוץ על התמונה כדי לראות גרסה גדולה יותר).

אניזוטרופיה

ניתן לשכפל חומרים רבים מהעולם האמיתי, כמו מתכת מבריקה, רק באמצעות מודל השתקפות. אפשר לשנות את החומר ממודל איזוסטרוגרפי שמוגדר כברירת מחדל למודל אניזוטרופי, על ידי שימוש בנכס anisotropy. בתמונה הבאה אפשר לראות חומר איזוטרי (בצד שמאל) וחומר אניסטרוגרפי (ימין).

ההבדל בין anisotropy

בתמונה שלמטה אפשר לראות איך ניתן לקבוע את הכיוון של ההדגשות האניזוטרופיות באמצעות ערכים חיוביים או שליליים: ערכים חיוביים (מצד שמאל) הגדרה של אניזוטרופיה בכיוון הטנגנס וערכים שליליים (ימין) בכיוון הטנגנס.

כיוון אניסוטרופיה

המאפיין anisotropyDirection מגדיר את הכיוון של פני השטח בנקודה נתונה, וכך שולט בצורה של ההדגשים ספקולטיביים. הוא מוגדר וקטור של 3 ערכים שבדרך כלל מגיעים ממרקם, עם קידוד של הקווים המקומיים למשטח.

ההשפעה של עיבוד anisotropyDirection ממתכת עם מפת כיוון מוצגת למטה (לוחצים על התמונה כדי לראות גרסה גדולה יותר).

מפת הכיוון המשמשת לעיבוד התמונה שלמעלה מוצגת למטה.

אטימת אווירה

המאפיין ambientOcclusion מגדיר איזה חלק מהאור מהסביבה נגיש לנקודת משטח. זהו גורם צללית לכל פיקסל בין 0.0 (צללית מלאה) ל-1.0 (תאורה מלאה). המאפיין הזה משפיע רק על תאורה ישירה ולא ישירה (תאורה מבוססת תמונה), ולא על תאורה ישירה, כמו כיווניות, תאורת נקודתיים או תאורה, או תאורה ספקולטיבית. התמונה הבאה עורכת השוואה בין חומרים בלי חסימה של אטימות לסביבה (שמאלה) ואיתה (ימין).

רגיל

המאפיין normal מגדיר את המצב הרגיל של פני השטח בנקודה נתונה. בדרך כלל מקורו הוא במרקם של מפה רגילה, שמאפשר לשנות את הנכס לכל פיקסל. הפונקציה הרגילה מתקבלת במרחב מוחשי, כלומר +Z נקודות מחוץ למשטח.

לדוגמה, נניח שאנחנו רוצים לעבד קטע ריהוט מכוסה בעור קטנטן. כדי ליצור מודלים גיאומטריים לייצוג מדויק של דפוסי הקרקע, תידרשו משולשים רבים מדי לאחר מכן ניתן להחיל את מפת הבסיס על רשת פשוטה. התמונה הבאה משווה בין רשת פשוטה ללא מיפוי רגיל (מצד שמאל) ועםה (ימין).

שימו לב שהנכס normal משפיע על שכבת הבסיס ולא על שכבת הציפוי הנקייה.

ניקוי מעיל רגיל

בנכס clearCoatNormal מוגדר המאפיין הרגיל של שכבת ציפוי ברורה בשלב נתון. הוא מתנהג אחרת כמו הנכס normal.

חיקוי

ניתן להשתמש בנכס emissive כדי לדמות אור נוסף שנפלט על ידי המשטח. הוא מוגדר כערך של float4 שמכיל צבע RGB (במרחב לינארי), וגם בערך של תגמול חשיפה (בערוץ האלפא).

למרות שערך חשיפה מציין בפועל שילובים של הגדרות מצלמה, לרוב הצלמים משתמשים בנתון הזה כדי לתאר את עוצמת התאורה. זו הסיבה לכך שמצלמות מאפשרות לצלמים להחיל פיצוי חשיפה על תמונה או בחשיפה חשופה יותר מדי. אפשר להשתמש בהגדרה הזו לשליטה אומנותית, אבל גם כדי להשיג חשיפה הולמת (למשל, שלג יחשוף כ-18% באמצע אפור).

ערך תגמול החשיפה של הנכס היציב יכול לאלץ את צבע האמירה להיות בהיר יותר (ערכים חיוביים) או כהה יותר (ערכים שליליים) של החשיפה הנוכחית. אם אפקט הפריחה מופעל, שימוש בפיצוי חיובי של חשיפה יכול לאלץ את פריחת המשטח.

דגם בד

כל המודלים החומריים שתוארו קודם לכן מיועדים לדמות משטחים צפופים, גם במאקרו וגם ברמת המיקרו. עם זאת, הרבה פעמים בגדים ובדים עשויים מחוטים משוחררים שפולטים או מפירים את תאורת האירוע. בהשוואה למשטחים קשים, הבד מתאפיין באבקה רכה יותר עם ספק נפילה גדולה, והנוכחות של תאורת ערפל נגרמת כתוצאה מפיזור קדימה/אחורה. חלק מהבדים מציגים גם צבעים ספקולטיביים משני גוונים (קטנות).

התמונה הבאה משווה בד ג'ינס שעבר עיבוד באמצעות המודל הסטנדרטי (מצד שמאל) ומודל הבד (ימין). שימו לב איך הדגם הסטנדרטי של החומר לא מצליח לתפוס את המראה של בד ג'ינס (מצד שמאל). המשטח נראה נוקשה (כמעט כמו פלסטיק) ודומה יותר לברזל מאשר פריט לבוש. ניתן גם לראות עד כמה האובי ספקולנט הרך נגרם בעקבות ספיגה ופיזור לשעות הפנאי האמינות של הבד.

Velvet הוא מקרה שימוש מעניין למודל של חומר בד. כפי שניתן לראות בתמונה שלמטה, סוג זה של תצוגות בד מסוג תאורה חזקה נגרם עקב פיזור קדימה ואחורה. אירועי הפיזור האלה נגרמות על ידי סיבים העומדים על פני הבד. כשאור האירוע מגיע מהכיוון לכיוון הנגדי, הסיבים יפנו את האור. באופן דומה, כאשר האירוע מתרחש מאותו כיוון באותו כיוון צפייה, הסיבים מפוזרים את האור אחורה.

חשוב לציין שיש סוגים של בדים שעדיין עוצבו כדי לבנות את דגמי המודלים של משטחים קשיחים. לדוגמה, ניתן ליצור מחדש עור, משי וסאטן באמצעות דגמי חומרים רגילים או אניזוטרופיים.

המודל של חומר הבד כולל את כל הפרמטרים שהוגדרו בעבר למצב החומר הרגיל, מלבד מטאל והשתקפות. קיימים גם שני פרמטרים נוספים שמתוארים בטבלה שבהמשך.

פרמטר הגדרה
heencolor גוון ספקולטיבי ליצירת בדים ספקולטיביים עם שני גוונים (ברירת המחדל היא \(\sqrt{baseColor}\))
subsurfacecolor גוון עבור הצבע המפוזר לאחר הפיזור וספיגה דרך החומר

הסוג והטווח של כל נכס מתוארים בטבלה הבאה.

מאפיין (property) סוג טווח הערה
heencolor לצוף 3 [0..1] RGB לינארי
subsurfacecolor לצוף 3 [0..1] RGB לינארי

כדי ליצור חומר דמוי קטיפה, אפשר להגדיר את צבע הבסיס לשחור (או לצבע כהה). במקום זאת, יש להגדיר את המידע כארומה בצבע הגוון. כדי ליצור בדים נפוצים יותר כמו ג'ינס, כותנה וכו', השתמשו בצבע הבסיס לכרומטיקה והשתמשו בברירת המחדל של צבע הגוון או הגדירו את צבע הגוון לזוהר של צבע הבסיס.

צבע הגוון

אפשר להשתמש בנכס sheenColor כדי לשנות ישירות את ההסתמכות על ספקטרום. יש בה יותר שליטה במראה הבד, וביכולתה ליצור חומרים ספקולטיביים בטון.

התמונה הבאה משווה בדים כחולים עם ובלי (שמאל) ועם ברק (ימין) (לוחצים על התמונה כדי לראות גרסה גדולה יותר).

צבע מתחת לפני השטח

בנכס subsurfaceColor אין חומר פיזי שניתן להשתמש בו כדי לדמות פיזור חלקי, עם פליטה חלקית של אור מסוגים מסוימים של בדים. אפשרות זו שימושית במיוחד ליצירת בדים רכים.

התמונה הבאה ממחישה את ההשפעה של subsurfaceColor. מוצגים בו בד לבן (עמוד שמאלי) לעומת בד לבן, עם פיזור על פני השטח החום (העמודה הימנית). אפשר ללחוץ על התמונה כדי לראות גרסה מוגדלת שלה.

הדגם לא מואר

ניתן להשתמש במודל החומר ללא התאורה כדי לכבות את כל חישובי התאורה. המטרה העיקרית שלה היא לעבד רכיבים מוארים מראש, כמו קוביית תוכן, תוכן חיצוני (כגון וידאו או שידור של מצלמה), ממשקי משתמש, רכיבים חזותיים/ניפוי באגים וכו'. המודל הלא מואר חושף רק שני נכסים המתוארים בטבלה שבהמשך.

מאפיין (property) הגדרה
basecolor צבע המיזוג
איטי צבע דיפיור נוסף להדמיה של משטחי הפצה. הנכס הזה שימושי בעיקר בצינור HDR, עם פריחתו

הסוג והטווח של כל נכס מתוארים בטבלה הבאה.

מאפיין (property) סוג טווח הערה
basecolor לצוף 4 [0..1] RGB לינארי מוכפל
איטי לצוף 4 rc=[0..1], a=N/A RGB ליניארי מרובה כפל, התעלמות מאלפא

הערך של emissive פשוט מתווסף ל-baseColor. השימוש העיקרי ב-emissive הוא לאלץ פריחה של משטח לא מואר אם צינור ה-HDR מוגדר כפריחה.

התמונה הבאה מציגה דוגמה למודל החומר הלא מואר המשמש לעיבוד מידע על תוצאות ניפוי באגים (לוחצים על התמונה כדי לראות גרסה גדולה יותר).

טיפול בצבעים

צבעים לינאריים

אם נתוני הצבע מגיעים ממרקם, פשוט הקפידו להשתמש במרקם 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, המערכת תכפיל אותו כברירת מחדל.