ב-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, המערכת תכפיל אותו כברירת מחדל.