Sceneform ডিফল্ট উপাদান সংজ্ঞা প্রদান করে ( .sfm
) যাতে বিকাশকারীদের জন্য চমৎকার ফলাফল পাওয়া সহজ হয়। ডেভেলপাররা যারা তাদের সম্পদের চেহারা গভীরভাবে কাস্টমাইজ করতে চান তারা তাদের নিজস্ব উপাদান সংজ্ঞা ( *.mat
ফাইল) তৈরি করতে পারেন এবং সম্পদের সংজ্ঞায় source
বৈশিষ্ট্য উল্লেখ করে তাদের সম্পদে প্রয়োগ করতে পারেন।
মুল ধারণা
- উপাদান
- একটি উপাদান একটি পৃষ্ঠের চাক্ষুষ চেহারা সংজ্ঞায়িত করে। একটি পৃষ্ঠকে সম্পূর্ণরূপে বর্ণনা এবং রেন্ডার করতে, একটি উপাদান নিম্নলিখিত তথ্য প্রদান করে:
- উপাদান মডেল
- ব্যবহার-নিয়ন্ত্রণযোগ্য নামের প্যারামিটারের সেট
- রাস্টার অবস্থা (ব্লেন্ডিং মোড, ব্যাকফেস কুলিং ইত্যাদি)
- ভার্টেক্স শেডার কোড
- ফ্র্যাগমেন্ট শেডার কোড
- উপাদান মডেল
- এছাড়াও শেডিং মডেল বা আলোক মডেল বলা হয়, উপাদান মডেল একটি পৃষ্ঠের অন্তর্নিহিত বৈশিষ্ট্য সংজ্ঞায়িত করে। এই বৈশিষ্ট্যগুলির প্রত্যক্ষ প্রভাব রয়েছে যেভাবে আলো গণনা করা হয় এবং তাই একটি পৃষ্ঠের চেহারার উপর।
- উপাদান সংজ্ঞা
- একটি পাঠ্য ফাইল যা একটি উপাদানের জন্য প্রয়োজনীয় সমস্ত তথ্য বর্ণনা করে। এই পৃষ্ঠাটি (
*.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
) হতে পারে। যদিও এই সিনট্যাক্সটি একটি বস্তুগত সংজ্ঞায় পুরোপুরি বৈধ, তবে স্ট্রিংগুলির চারপাশে উদ্ধৃতি ছাড়া একটি বৈকল্পিক JSONish-এ গৃহীত হয়:
key : value
উদ্ধৃতি বাধ্যতামূলক থাকে যখন স্ট্রিংটিতে স্পেস থাকে।
vertex
এবং fragment
ব্লকগুলিতে অব্যক্ত, উদ্ধৃতিহীন GLSL কোড রয়েছে, যা 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 শনাক্তকারী হতে হবে৷ টাইপটি অবশ্যই নীচের টেবিলে বর্ণিত প্রকারগুলির মধ্যে একটি হতে হবে।টাইপ বর্ণনা bool একক বুলিয়ান bool2 2 বুলিয়ানের ভেক্টর bool3 3 বুলিয়ানের ভেক্টর bool4 4টি বুলিয়ানের ভেক্টর ভাসা একক ভাসা float2 2 ফ্লোটের ভেক্টর float3 3 ফ্লোটের ভেক্টর float4 4টি ফ্লোটের ভেক্টর int একক পূর্ণসংখ্যা int2 2 পূর্ণসংখ্যার ভেক্টর int3 3 পূর্ণসংখ্যার ভেক্টর int4 4 পূর্ণসংখ্যার ভেক্টর sampler2d 2D টেক্সচার নমুনা বহিরাগত বাহ্যিক টেক্সচার। আরও তথ্যের জন্য, External Texture এবং setExternalTexture() দেখুন - স্যাম্পলার
স্যাম্পলার প্রকারগুলি একটি
format
(float
থেকে ডিফল্ট) এবং একটিprecision
(ডিফল্ট থেকেdefault
) নির্দিষ্ট করতে পারে। বিন্যাসint
,float
এক হতে পারে. নির্ভুলতাdefault
হতে পারে (প্ল্যাটফর্মের জন্য সর্বোত্তম নির্ভুলতা, সাধারণত ডেস্কটপেhigh
, মোবাইলেmedium
),low
,medium
,high
।- বর্ণনা
আপনার উপাদান দ্বারা প্রয়োজনীয় পরামিতি তালিকা. এই পরামিতিগুলি Sceneform এর উপাদান 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
বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত করা হয় এবং নির্দিষ্ট করার প্রয়োজন নেই।unlit
নয় এমন কোনো শেডিং মডেল নির্বাচন করার সময়tangents
বৈশিষ্ট্য স্বয়ংক্রিয়ভাবে প্রয়োজন হয়। শেডার থেকে এই বৈশিষ্ট্যগুলি কীভাবে অ্যাক্সেস করবেন সে সম্পর্কে আরও তথ্যের জন্য এই নথির শেডার বিভাগগুলি দেখুন৷
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
ব্যবহার করে ফ্র্যাগমেন্টeyeDirection
এটি অ্যাক্সেস করতে পারেন। ভার্টেক্স শেডারে, ইন্টারপোলান্ট নামটি কেবলMaterialVertexInputs
কাঠামোর সদস্য (আপনার উদাহরণেmaterial.eyeDirection
)। প্রতিটি ইন্টারপোলান্টvec4
float4
টাইপের।
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
। - বর্ণনা
কিভাবে/যদি রেন্ডার করা বস্তু রেন্ডার টার্গেটের বিষয়বস্তুর সাথে মিশ্রিত হয় তা নির্ধারণ করে। সম্ভাব্য মিশ্রন মোড হল:
- অস্বচ্ছ : মিশ্রন নিষ্ক্রিয় করা হয়েছে, উপাদানের আউটপুটের আলফা চ্যানেল উপেক্ষা করা হয়েছে।
- স্বচ্ছ : মিশ্রন সক্ষম করা হয়েছে। পোর্টার-ডাফের সোর্স ওভার রুল ব্যবহার করে উপাদানটির আউটপুট রেন্ডার টার্গেটের সাথে আলফা সংমিশ্রিত। এই মিশ্রন মোড প্রাক-গুনিত আলফা অনুমান করে।
- ফেইড :
transparent
হিসাবে কাজ করে তবে স্পেকুলার আলোতেও স্বচ্ছতা প্রয়োগ করা হয়।transparent
মোডে, উপাদানের আলফা মান শুধুমাত্র বিচ্ছুরিত আলোতে প্রযোজ্য। এই মিশ্রন মোড আলোকিত বস্তুগুলিকে ভিতরে এবং বাইরে বিবর্ণ করতে কার্যকর। - যোগ করুন : মিশ্রন সক্রিয় করা হয়েছে. উপাদানের আউটপুট রেন্ডার লক্ষ্য বিষয়বস্তু যোগ করা হয়.
- মুখোশযুক্ত : মিশ্রন নিষ্ক্রিয়। এই ব্লেন্ডিং মোড আলফা মাস্কিং সক্ষম করে। উপাদানের আউটপুট আলফা চ্যানেল সংজ্ঞায়িত করে যে একটি খণ্ডটি বাতিল করা হয়েছে কিনা। আরও তথ্যের জন্য maskThreshold বিভাগটি দেখুন।
material {
blending : transparent
}
vertexDomain
- টাইপ
-
string
- মান
-
object
,world
,view
,device
এর যে কোন একটি।object
ডিফল্ট। - বর্ণনা
রেন্ডার করা জালের ডোমেন (বা স্থানাঙ্ক স্থান) সংজ্ঞায়িত করে। ডোমেনটি প্রভাবিত করে কিভাবে শীর্ষবিন্দুগুলি ভার্টেক্স শেডারে রূপান্তরিত হয়। সম্ভাব্য ডোমেনগুলি হল:
- অবজেক্ট : শীর্ষবিন্দুগুলি বস্তুর (বা মডেল) স্থানাঙ্কে সংজ্ঞায়িত করা হয়। রেন্ডার করা বস্তুর ট্রান্সফর্ম ম্যাট্রিক্স ব্যবহার করে শীর্ষবিন্দুগুলিকে রূপান্তরিত করা হয়
- বিশ্ব : শীর্ষবিন্দু বিশ্ব স্থানাঙ্ক স্থান সংজ্ঞায়িত করা হয়. রেন্ডার করা বস্তুর রূপান্তর ব্যবহার করে শীর্ষবিন্দুগুলি রূপান্তরিত হয় না।
- দেখুন : শীর্ষবিন্দুগুলি দৃশ্যে (বা চক্ষু বা ক্যামেরা) স্থানাঙ্ক স্থান সংজ্ঞায়িত করা হয়। রেন্ডার করা বস্তুর রূপান্তর ব্যবহার করে শীর্ষবিন্দুগুলি রূপান্তরিত হয় না।
- ডিভাইস : শীর্ষবিন্দুগুলিকে সাধারণ ডিভাইসে (বা ক্লিপ) স্থানাঙ্কের জায়গায় সংজ্ঞায়িত করা হয়। রেন্ডার করা বস্তুর রূপান্তর ব্যবহার করে শীর্ষবিন্দুগুলি রূপান্তরিত হয় না।
material {
vertexDomain : device
}
ইন্টারপোলেশন
- টাইপ
-
string
- মান
- যেকোনো
smooth
,flat
। ডিফল্টsmooth
. - বর্ণনা
- সংজ্ঞায়িত করে কিভাবে ইন্টারপোলান্ট (বা ভেরিয়েবল) শীর্ষবিন্দুর মধ্যে ইন্টারপোলেট করা হয়। যখন এই সম্পত্তি
smooth
সেট করা হয়, একটি দৃষ্টিকোণ সঠিক ইন্টারপোলেশন প্রতিটি ইন্টারপোল্যান্ট সঞ্চালিত হয়.flat
সেট করা হলে, কোনো ইন্টারপোলেশন সঞ্চালিত হয় না এবং একটি প্রদত্ত ত্রিভুজের মধ্যে থাকা সমস্ত খণ্ড একই ছায়াযুক্ত হবে।
material {
interpolation : flat
}
culling
- টাইপ
-
string
- মান
-
none
,front
,back
, সামনে এবংfrontAndBack
।back
ডিফল্ট. - বর্ণনা
- কোন ত্রিভুজগুলি কাটা উচিত তা সংজ্ঞায়িত করে: কোনটিই নয়, সম্মুখমুখী ত্রিভুজ, পিছনের মুখী ত্রিভুজ বা সমস্ত৷
material {
culling : none
}
রঙ লিখুন
- টাইপ
-
boolean
- মান
-
true
বাfalse
। ডিফল্ট থেকেtrue
। - বর্ণনা
- রঙিন বাফারে লেখা সক্রিয় বা নিষ্ক্রিয় করে।
material {
colorWrite : false
}
গভীরতা লিখুন
- টাইপ
-
boolean
- মান
-
true
বাfalse
। ডিফল্ট থেকেtrue
। - বর্ণনা
- গভীরতা বাফারে লিখতে সক্ষম বা নিষ্ক্রিয় করে।
material {
depthWrite : false
}
depthCulling
- টাইপ
-
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
এর অ্যারে - মান
- প্রতিটি এন্ট্রি হতে হবে গতিশীল আলো,
directionalLighting
shadowReceiver
dynamicLighting
skinning
। - বর্ণনা
- শেডার ভেরিয়েন্টগুলির একটি তালিকা নির্দিষ্ট করতে ব্যবহৃত হয় যা অ্যাপ্লিকেশন গ্যারান্টি দেয় কখনই প্রয়োজন হবে না। এই শেডার ভেরিয়েন্টগুলি কোড জেনারেশন পর্বের সময় এড়িয়ে যায়, এইভাবে উপাদানটির সামগ্রিক আকার হ্রাস করে। মনে রাখবেন কিছু ভেরিয়েন্ট স্বয়ংক্রিয়ভাবে ফিল্টার আউট হতে পারে। উদাহরণস্বরূপ, সমস্ত আলো সম্পর্কিত রূপগুলি (
directionalLighting
আলো, ইত্যাদি) একটিunlit
উপাদান কম্পাইল করার সময় ফিল্টার করা হয়। সতর্কতার সাথে ভেরিয়েন্ট ফিল্টার ব্যবহার করুন, রানটাইমে প্রয়োজনীয় একটি বৈকল্পিক ফিল্টার করা ক্র্যাশ হতে পারে।
ভেরিয়েন্টের বর্ণনা: - directionalLighting
আলো, যখন দৃশ্যে একটি দিকনির্দেশক আলো উপস্থিত থাকে তখন ব্যবহৃত হয় - গতিশীল আলো, যখন দৃশ্যে একটি অ-দিকনির্দেশক আলো (বিন্দু, স্পট, ইত্যাদি) উপস্থিত shadowReceiver
dynamicLighting
যখন কোনও বস্তু গ্রহণ করতে পারে তখন ব্যবহৃত হয় শ্যাডোস - skinning
, যখন জিপিইউ স্কিনিং ব্যবহার করে কোনো বস্তু অ্যানিমেটেড করা হয় তখন ব্যবহার করা হয়
material {
name : "Invisible shadow plane",
shadingModel : unlit,
shadowMultiplier : true,
blending : transparent,
variantFilter : [ skinning ]
}
ভার্টেক্স ব্লক
শীর্ষবিন্দু ব্লক ঐচ্ছিক এবং উপাদানের শীর্ষবিন্দু ছায়া স্তর নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে। ভার্টেক্স ব্লকে অবশ্যই বৈধ 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
স্ট্রাকচার ছাড়াও, আপনার ভার্টেক্স শেডিং কোড Shader পাবলিক APIs বিভাগে তালিকাভুক্ত সমস্ত পাবলিক API ব্যবহার করতে পারে।
উপাদান শীর্ষবিন্দু ইনপুট
struct MaterialVertexInputs {
float4 color; // if the color attribute is required
float2 uv0; // if the uv0 attribute is required
float2 uv1; // if the uv1 attribute is required
float3 worldNormal; // only if the shading model is not unlit
float4 worldPosition; // always available
// variable* names are replaced with actual names
float4 variable0; // if 1 or more variables is defined
float4 variable1; // if 2 or more variables is defined
float4 variable2; // if 3 or more variables is defined
float4 variable3; // if 4 or more variables is defined
};
খণ্ড ব্লক
খণ্ড ব্লক উপাদানের খণ্ড ছায়া স্তর নিয়ন্ত্রণ করতে ব্যবহার করা আবশ্যক. ফ্র্যাগমেন্ট ব্লকে অবশ্যই বৈধ 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;
}
}
প্রস্তুত উপাদান ফাংশন
নোট করুন যে আপনাকে material()
ফাংশন থেকে প্রস্থান করার আগে প্রস্তুত prepareMaterial(material)
কল করতে হবে । এই prepareMaterial
ফাংশন উপাদান মডেলের অভ্যন্তরীণ অবস্থা সেট আপ করে। Fragment APIs বিভাগে বর্ণিত কিছু API - যেমন shading_normal
উদাহরণস্বরূপ - শুধুমাত্র readyMaterial 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)
}
Shader পাবলিক APIs
প্রকারভেদ
যদিও GLSL প্রকারগুলি সরাসরি ব্যবহার করা যেতে পারে ( vec4
বা mat4
) আমরা নিম্নলিখিত ধরণের উপনামগুলি ব্যবহার করার পরামর্শ দিই:
নাম | GLSL প্রকার | বর্ণনা |
---|---|---|
bool2 | bvec2 | 2 বুলিয়ানের একটি ভেক্টর |
bool3 | bvec3 | 3 বুলিয়ানের একটি ভেক্টর |
bool4 | bvec4 | 4 বুলিয়ানের একটি ভেক্টর |
int2 | ivec2 | 2 পূর্ণসংখ্যার একটি ভেক্টর |
int3 | ivec3 | 3 পূর্ণসংখ্যার একটি ভেক্টর |
int4 | ivec4 | 4 পূর্ণসংখ্যার একটি ভেক্টর |
uint2 | uvec2 | 2টি স্বাক্ষরবিহীন পূর্ণসংখ্যার একটি ভেক্টর |
uint3 | uvec3 | 3টি স্বাক্ষরবিহীন পূর্ণসংখ্যার একটি ভেক্টর |
uint4 | uvec4 | 4টি স্বাক্ষরবিহীন পূর্ণসংখ্যার একটি ভেক্টর |
float2 | float2 | 2টি ফ্লোটের একটি ভেক্টর |
float3 | float3 | 3টি ফ্লোটের একটি ভেক্টর |
float4 | float4 | 4 ফ্লোটের একটি ভেক্টর |
float4x4 | mat4 | একটি 4x4 ফ্লোট ম্যাট্রিক্স |
float3x3 | mat3 | একটি 3x3 ফ্লোট ম্যাট্রিক্স |
গণিত
নাম | টাইপ | বর্ণনা |
---|---|---|
পি.আই | ভাসা | একটি ধ্রুবক যা \(\pi\)প্রতিনিধিত্ব করে |
HALF_PI | ভাসা | একটি ধ্রুবক যা\(\frac{\pi}{2}\)প্রতিনিধিত্ব করে |
স্যাচুরেট (ফ্লোট এক্স) | ভাসা | 0.0 এবং 1.0 এর মধ্যে নির্দিষ্ট মান ক্ল্যাম্প করে |
pow5(float x) | ভাসা | গণনা করে \(x^5\) |
বর্গ (ফ্লোট এক্স) | ভাসা | কম্পিউট \(x^2\) |
max3(float3 v) | ভাসা | নির্দিষ্ট float3 এর সর্বোচ্চ মান প্রদান করে |
mulMat4x4Float3(float4x4 m, float3 v) | float4 | \(m * v\) |
mulMat3x3Float3(float4x4 m, float3 v) | float4 | \(m * v\) |
ম্যাট্রিক্স
নাম | টাইপ | বর্ণনা |
---|---|---|
getViewFromWorldMatrix() | float4x4 | ম্যাট্রিক্স যা ওয়ার্ল্ড স্পেস থেকে ভিউ/আই স্পেসে রূপান্তর করে |
getWorldFromViewMatrix() | float4x4 | ম্যাট্রিক্স যা ভিউ/আই স্পেস থেকে ওয়ার্ল্ড স্পেসে রূপান্তর করে |
getClipFromViewMatrix() | float4x4 | ম্যাট্রিক্স যা ভিউ/আই স্পেস থেকে ক্লিপ (NDC) স্পেসে রূপান্তর করে |
getViewFromClipMatrix() | float4x4 | ম্যাট্রিক্স যা ক্লিপ (এনডিসি) স্থান থেকে দর্শন/চোখের স্থানে রূপান্তরিত করে |
GetClipFromWorldMatrix() | float4x4 | ম্যাট্রিক্স যা বিশ্ব থেকে ক্লিপ (NDC) স্পেসে রূপান্তর করে |
ফ্রেম ধ্রুবক
নাম | টাইপ | বর্ণনা |
---|---|---|
getResolution() | float4 | পিক্সেলে দৃশ্যের রেজোলিউশন: width , height , 1 / width , 1 / height |
GetWorldCameraPosition() | float3 | বিশ্ব মহাকাশে ক্যামেরা/চোখের অবস্থান |
সময় পেতে() | ভাসা | সিনফর্ম ইঞ্জিন শুরু হওয়ার পর থেকে সেকেন্ডে সময়, যথার্থতা ক্ষতি এড়াতে নিয়মিত রিসেট করা হতে পারে |
গেট এক্সপোজার() | ভাসা | ক্যামেরার ফটোমেট্রিক এক্সপোজার |
getEV100() | ভাসা | ক্যামেরার ISO 100-এ এক্সপোজার মান |
শুধুমাত্র ভার্টেক্স
নিম্নলিখিত API গুলি শুধুমাত্র শীর্ষ ব্লক থেকে উপলব্ধ:
নাম | টাইপ | বর্ণনা |
---|---|---|
getPosition() | float4 | উপাদান দ্বারা সংজ্ঞায়িত ডোমেনে শীর্ষস্থানীয় অবস্থান (ডিফল্ট: অবজেক্ট/মডেল স্পেস) |
GetWorldFromModelMatrix() | float4x4 | ম্যাট্রিক্স যা মডেল (বস্তু) স্থান থেকে বিশ্ব স্থান পরিবর্তন করে |
GetWorldFromModelNormalMatrix() | float3x3 | ম্যাট্রিক্স যা নর্মালকে মডেল (বস্তু) স্থান থেকে বিশ্ব মহাকাশে রূপান্তর করে |
শুধুমাত্র টুকরা
নিম্নলিখিত APIগুলি শুধুমাত্র খণ্ড ব্লক থেকে উপলব্ধ:
নাম | টাইপ | বর্ণনা |
---|---|---|
GetWorldTangentFrame() | float3x3 | ম্যাট্রিক্স যেখানে প্রতিটি কলামে বিশ্বের স্থানের শীর্ষবিন্দুর tangent ( frame[0] ), bi-tangent ( frame[1] ) এবং normal ( frame[2] ) থাকে। যদি উপাদানটি বাম্প ম্যাপিংয়ের জন্য একটি স্পর্শক স্থানকে স্বাভাবিক গণনা না করে বা যদি ছায়াটি অ্যানিসোট্রপিক না হয় তবে এই ম্যাট্রিক্সে শুধুমাত্র normal বৈধ। |
GetWorldPosition() | float3 | বিশ্ব মহাকাশে খণ্ডটির অবস্থান |
getWorldViewVector() | float3 | খণ্ডের অবস্থান থেকে চোখের পর্যন্ত বিশ্ব মহাকাশে স্বাভাবিক ভেক্টর |
getWorldNormalVector() | float3 | ওয়ার্ল্ড স্পেসে স্বাভাবিক করা হয়েছে, বাম্প ম্যাপিংয়ের পরে prepareMaterial() পরে ব্যবহার করতে হবে) |
GetWorld ReflectedVector() | float3 | স্বাভাবিক সম্পর্কে ভিউ ভেক্টরের প্রতিফলন ( prepareMaterial() পরে ব্যবহার করা আবশ্যক) |
getNdotV() | ভাসা | dot(normal, view) এর ফলাফল, সর্বদা কঠোরভাবে 0-এর বেশি ( prepareMaterial() পরে ব্যবহার করা আবশ্যক) |
getColor() | float4 | খণ্ডের ইন্টারপোলেটেড রঙ, যদি রঙের বৈশিষ্ট্য প্রয়োজন হয় |
getUV0() | float2 | UV স্থানাঙ্কের প্রথম ইন্টারপোলেটেড সেট, যদি uv0 অ্যাট্রিবিউটের প্রয়োজন হয় |
getUV1() | float2 | UV স্থানাঙ্কের প্রথম ইন্টারপোলেটেড সেট, যদি uv1 অ্যাট্রিবিউটের প্রয়োজন হয় |
inverseTonemap(float3) | float3 | নির্দিষ্ট রৈখিক sRGB রঙে বিপরীত টোন ম্যাপিং অপারেটর প্রয়োগ করে। এই অপারেশন একটি আনুমানিক হতে পারে |
inverseTonemapSRGB(float3) | float3 | নির্দিষ্ট নন-লিনিয়ার sRGB রঙে বিপরীত টোন ম্যাপিং অপারেটর প্রয়োগ করে। এই অপারেশন একটি আনুমানিক হতে পারে |
আলোক (float3) | ভাসা | নির্দিষ্ট রৈখিক sRGB রঙের উজ্জ্বলতা গণনা করে |
উপাদান মডেল
সিনফর্ম উপকরণ নিম্নলিখিত উপাদান মডেলগুলির মধ্যে একটি ব্যবহার করতে পারে:
- আলো (বা মান)
- কাপড়
- আনলাইট
আলোকিত মডেল
আলোকিত মডেল হল Sceneform এর আদর্শ উপাদান মডেল। এই শারীরিক-ভিত্তিক শেডিং মডেলটি ইউনিটি 5 , অবাস্তব ইঞ্জিন 4 , সাবস্ট্যান্স ডিজাইনার বা মারমোসেট টুলব্যাগের মতো অন্যান্য সাধারণ সরঞ্জাম এবং ইঞ্জিনগুলির সাথে ভাল ইন্টারঅপারেবিলিটি অফার করার পরে ডিজাইন করা হয়েছিল।
এই উপাদানের মডেলটি প্রচুর পরিমাণে অ-ধাতব পৃষ্ঠ ( ডাইলেট্রিক্স ) বা ধাতব পৃষ্ঠ ( পরিবাহী ) বর্ণনা করতে ব্যবহার করা যেতে পারে।
স্ট্যান্ডার্ড মডেল ব্যবহার করে একটি উপাদানের চেহারা নীচের টেবিলে বর্ণিত বৈশিষ্ট্যগুলি ব্যবহার করে নিয়ন্ত্রিত হয়।
স্ট্যান্ডার্ড মডেলের বৈশিষ্ট্য
সম্পত্তি | সংজ্ঞা |
---|---|
বেস কালার | ধাতব পৃষ্ঠের জন্য ডিফিউজ অ্যালবেডো এবং ধাতব পৃষ্ঠের জন্য স্পেকুলার রঙ |
ধাতব | একটি পৃষ্ঠকে অস্তরক (0.0) বা পরিবাহী (1.0) বলে মনে হচ্ছে কিনা। প্রায়শই বাইনারি মান হিসাবে ব্যবহৃত হয় (0 বা 1) |
রুক্ষতা | অনুভূত মসৃণতা (1.0) বা একটি পৃষ্ঠের রুক্ষতা (0.0)। মসৃণ পৃষ্ঠতল তীক্ষ্ণ প্রতিফলন প্রদর্শন করে |
প্রতিফলন | অস্তরক পৃষ্ঠতলের জন্য স্বাভাবিক ঘটনাতে ফ্রেসনেল প্রতিফলন। এটি সরাসরি প্রতিফলনের শক্তি নিয়ন্ত্রণ করে |
পরিষ্কার কোট | পরিষ্কার কোট স্তর শক্তি |
পরিষ্কার কোট রুক্ষতা | স্পষ্ট কোট স্তরের মসৃণতা বা রুক্ষতা অনুভূত |
অ্যানিসোট্রপি | স্পর্শক বা বিট্যানজেন্ট দিক থেকে অ্যানিসোট্রপির পরিমাণ |
অ্যানিসোট্রপি নির্দেশিকা | স্থানীয় পৃষ্ঠের দিক |
পরিবেষ্টিত অবরোধ | একটি পৃষ্ঠ বিন্দুতে কত পরিবেষ্টিত আলো অ্যাক্সেসযোগ্য তা নির্ধারণ করে। এটি 0.0 এবং 1.0 এর মধ্যে একটি প্রতি-পিক্সেল শ্যাডোয়িং ফ্যাক্টর |
স্বাভাবিক | বাম্প ম্যাপিং ( স্বাভাবিক ম্যাপিং ) ব্যবহার করে পৃষ্ঠকে বিরক্ত করতে ব্যবহৃত একটি বিশদ স্বাভাবিক |
পরিষ্কার কোট স্বাভাবিক | বাম্প ম্যাপিং ( স্বাভাবিক ম্যাপিং ) ব্যবহার করে পরিষ্কার কোট স্তরকে বিরক্ত করতে ব্যবহৃত একটি বিশদ স্বাভাবিক |
নির্গত | অতিরিক্ত ডিফিউজ অ্যালবেডো নির্গত পৃষ্ঠগুলিকে অনুকরণ করতে (যেমন নিয়ন, ইত্যাদি) এই বৈশিষ্ট্যটি একটি ব্লুম পাস সহ একটি HDR পাইপলাইনে বেশিরভাগই কার্যকর। |
প্রতিটি সম্পত্তির ধরন এবং পরিসীমা নীচের সারণীতে বর্ণনা করা হয়েছে।
সম্পত্তি | টাইপ | পরিসর | বিঃদ্রঃ |
---|---|---|---|
বেস কালার | float4 | [০..১] | প্রাক-গুনিত লিনিয়ার RGB |
ধাতব | ভাসা | [০..১] | 0 বা 1 হওয়া উচিত |
রুক্ষতা | ভাসা | [০..১] | |
প্রতিফলন | ভাসা | [০..১] | মান পছন্দ করুন > 0.35 |
পরিষ্কার কোট | ভাসা | [০..১] | 0 বা 1 হওয়া উচিত |
পরিষ্কার কোট রুক্ষতা | ভাসা | [০..১] | [0..0.6] এ রিম্যাপ |
অ্যানিসোট্রপি | ভাসা | [-1..1] | অ্যানিসোট্রপি স্পর্শক দিকে থাকে যখন এই মানটি ধনাত্মক হয় |
অ্যানিসোট্রপি নির্দেশিকা | float3 | [০..১] | লিনিয়ার RGB, স্পর্শক স্থানে একটি দিক ভেক্টরকে এনকোড করে |
পরিবেষ্টিত অবরোধ | ভাসা | [০..১] | |
স্বাভাবিক | float3 | [০..১] | লিনিয়ার RGB, স্পর্শক স্থানে একটি দিক ভেক্টরকে এনকোড করে |
পরিষ্কার কোট স্বাভাবিক | float3 | [০..১] | লিনিয়ার RGB, স্পর্শক স্থানে একটি দিক ভেক্টরকে এনকোড করে |
নির্গত | float4 | rgb=[0..1], a=[-n..n] | আলফা হল এক্সপোজার ক্ষতিপূরণ |
বেস রঙ
baseColor
বৈশিষ্ট্য একটি বস্তুর অনুভূত রং সংজ্ঞায়িত করে (কখনও কখনও আলবেডো বলা হয়)। baseColor
প্রভাব পৃষ্ঠের প্রকৃতির উপর নির্ভর করে, ধাতব বিভাগে ব্যাখ্যা করা metallic
সম্পত্তি দ্বারা নিয়ন্ত্রিত।
- অ-ধাতু (অস্তরক)
পৃষ্ঠের বিচ্ছুরিত রঙ সংজ্ঞায়িত করে। বাস্তব-বিশ্বের মানগুলি সাধারণত পরিসরে পাওয়া যায় [10..240] যদি মানটি 0 এবং 255 এর মধ্যে এনকোড করা হয়, অথবা 0 এবং 1 এর মধ্যে [0.04..0.94] পরিসরে থাকে। অ-ধাতুর জন্য বেস রঙের বেশ কয়েকটি উদাহরণ পৃষ্ঠতল নীচের টেবিলে পাওয়া যাবে.
ধাতু 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 ইট 0.58, 0.49, 0.46 #947d75 বালি ০.৬৯, ০.৬৬, ০.৫২ #b1a884 কংক্রিট 0.75, 0.75, 0.73 #c0bfbb - ধাতু (পরিবাহী)
পৃষ্ঠের স্পেকুলার রঙ সংজ্ঞায়িত করে। বাস্তব-বিশ্বের মানগুলি সাধারণত পরিসরে পাওয়া যায় [170..255] যদি মানটি 0 এবং 255 এর মধ্যে এনকোড করা হয়, অথবা 0 এবং 1 এর মধ্যে [0.66..1.0] পরিসরে থাকে। ধাতব পৃষ্ঠের জন্য বেস রঙের বেশ কয়েকটি উদাহরণ হতে পারে নীচের টেবিলে পাওয়া যাবে।
ধাতু sRGB হেক্সাডেসিমেল রঙ সিলভার ০.৯৮, ০.৯৮, ০.৯৬ #faf9f5 অ্যালুমিনিয়াম ০.৯৬, ০.৯৬, ০.৯৬ #f4f5f5 টাইটানিয়াম 0.81, 0.78, 0.76 #cec8c2 আয়রন 0.76, 0.74, 0.73 #c0bdba প্লাটিনাম ০.৮৪, ০.৮২, ০.৭৯ #d6d1c8 সোনা 1.00, 0.87, 0.62 #fedc9d পিতল ০.৯৬, ০.৮৯, ০.৬৮ #f4e4ad তামা ০.৯৮, ০.৮৫, ০.৭২ #fbd8b8
ধাতব
metallic
সম্পত্তি সংজ্ঞায়িত করে যে পৃষ্ঠটি একটি ধাতব ( পরিবাহী ) বা একটি অধাতু ( অস্তরক ) পৃষ্ঠ। এই বৈশিষ্ট্যটি একটি বাইনারি মান হিসাবে ব্যবহার করা উচিত, যেটি হয় 0 বা 1 তে সেট করা। মধ্যবর্তী মানগুলি টেক্সচার ব্যবহার করার সময় বিভিন্ন ধরণের পৃষ্ঠের মধ্যে রূপান্তর তৈরি করতে সত্যই কার্যকর।
এই সম্পত্তি নাটকীয়ভাবে একটি পৃষ্ঠ চেহারা পরিবর্তন করতে পারেন. অ-ধাতুর পৃষ্ঠের ক্রোম্যাটিক ডিফিউজ প্রতিফলন এবং অ্যাক্রোম্যাটিক স্পেকুলার প্রতিফলন রয়েছে (প্রতিফলিত আলো রঙ পরিবর্তন করে না)। ধাতব পৃষ্ঠতলের কোনো বিচ্ছুরিত প্রতিফলন এবং ক্রোম্যাটিক স্পেকুলার প্রতিফলন নেই (প্রতিফলিত আলো baseColor
কালার দ্বারা সংজ্ঞায়িত পৃষ্ঠের রঙের উপর নির্ভর করে)।
metallic
প্রভাব নীচে দেখানো হয়েছে (একটি বড় সংস্করণ দেখতে ছবিতে ক্লিক করুন)।
রুক্ষতা
roughness
সম্পত্তি পৃষ্ঠের অনুভূত মসৃণতা নিয়ন্ত্রণ করে। roughness
0 এ সেট করা হলে, পৃষ্ঠটি পুরোপুরি মসৃণ এবং অত্যন্ত চকচকে হয়। একটি পৃষ্ঠ যত বেশি রুক্ষ হয়, প্রতিফলনগুলি "অস্পষ্ট" হয়। এই বৈশিষ্ট্যটিকে প্রায়শই অন্যান্য ইঞ্জিন এবং সরঞ্জামগুলিতে গ্লসিনেস বলা হয় এবং এটি কেবল রুক্ষতার বিপরীত ( roughness = 1 - glossiness
)।
অ-ধাতু
অধাতু পৃষ্ঠের roughness
প্রভাব নীচে দেখানো হয়েছে (একটি বড় সংস্করণ দেখতে ছবিতে ক্লিক করুন)।
ধাতু
ধাতব পৃষ্ঠের উপর roughness
প্রভাব নীচে দেখানো হয়েছে (একটি বড় সংস্করণ দেখতে ছবিতে ক্লিক করুন)।
প্রতিফলন
reflectance
সম্পত্তি শুধুমাত্র অ ধাতব পৃষ্ঠকে প্রভাবিত করে। এই সম্পত্তি specular তীব্রতা নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে. এই মানটি 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
বৈশিষ্ট্য ব্যবহার করে একটি উপাদানকে ডিফল্ট আইসোট্রপিক মডেল থেকে অ্যানিসোট্রপিক মডেলে পরিবর্তন করা যেতে পারে। নিম্নলিখিত চিত্রটি একটি আইসোট্রপিক উপাদান (বাম) এবং একটি অ্যানিস্ট্রোপিক উপাদান (ডান) তুলনা করে।
একটি রুক্ষ ধাতুতে 0.0 (বাম) থেকে 1.0 (ডান) পর্যন্ত পরিবর্তিত anisotropy
প্রভাব নীচে দেখানো হয়েছে (একটি বড় সংস্করণ দেখতে ছবিতে ক্লিক করুন)।
নীচের চিত্রটি দেখায় যে কীভাবে ধনাত্মক বা ঋণাত্মক মান ব্যবহার করে অ্যানিসোট্রপিক হাইলাইটের দিক নিয়ন্ত্রণ করা যেতে পারে: ইতিবাচক মান (বাম) অ্যানিসোট্রপিকে স্পর্শক দিক এবং নেতিবাচক মান (ডান) বিট্যাঞ্জেন্ট দিকে সংজ্ঞায়িত করে।
অ্যানিসোট্রপি দিক
anisotropyDirection
বৈশিষ্ট্য একটি নির্দিষ্ট বিন্দুতে পৃষ্ঠের দিক নির্ধারণ করে এবং এইভাবে স্পেকুলার হাইলাইটগুলির আকৃতি নিয়ন্ত্রণ করে। এটি 3টি মানের ভেক্টর হিসাবে নির্দিষ্ট করা হয় যা সাধারণত একটি টেক্সচার থেকে আসে, পৃষ্ঠের স্থানীয় দিকগুলিকে এনকোড করে।
একটি দিক মানচিত্র সহ একটি anisotropyDirection
রেন্ডার করার প্রভাব নীচে দেখানো হয়েছে (একটি বড় সংস্করণ দেখতে ছবিতে ক্লিক করুন)।
উপরের চিত্রটি রেন্ডার করতে ব্যবহৃত দিক মানচিত্রটি নীচে দেখানো হয়েছে।
পরিবেষ্টিত অবরোধ
ambientOcclusion
প্রপার্টি নির্ধারণ করে যে কত পরিবেষ্টিত আলো একটি পৃষ্ঠ বিন্দুতে অ্যাক্সেসযোগ্য। এটি 0.0 (সম্পূর্ণ ছায়াযুক্ত) এবং 1.0 (সম্পূর্ণ আলোকিত) এর মধ্যে একটি প্রতি-পিক্সেল শ্যাডোয়িং ফ্যাক্টর। এই বৈশিষ্ট্যটি শুধুমাত্র বিচ্ছুরিত পরোক্ষ আলো (চিত্র-ভিত্তিক আলো) প্রভাবিত করে, সরাসরি আলো যেমন দিকনির্দেশক, পয়েন্ট এবং স্পট লাইট বা স্পেকুলার লাইটিং নয়। নিচের চিত্রটি ছড়িয়ে থাকা পরিবেষ্টিত আবদ্ধতা (বাম) এবং এর সাথে (ডান) ছাড়া উপকরণের তুলনা করে।
স্বাভাবিক
normal
সম্পত্তি একটি নির্দিষ্ট বিন্দুতে পৃষ্ঠের স্বাভাবিককে সংজ্ঞায়িত করে। এটি সাধারণত একটি সাধারণ মানচিত্র টেক্সচার থেকে আসে, যা পিক্সেল প্রতি সম্পত্তির পরিবর্তন করতে দেয়। স্বাভাবিকটি স্পর্শক স্থানে সরবরাহ করা হয়, যার অর্থ হল +Z পৃষ্ঠের বাইরে বিন্দু।
উদাহরণস্বরূপ, আসুন কল্পনা করা যাক যে আমরা টুফ্টেড চামড়ায় আচ্ছাদিত একটি আসবাবপত্র রেন্ডার করতে চাই। গুঁড়া প্যাটার্নটিকে সঠিকভাবে উপস্থাপন করার জন্য জ্যামিতি মডেল করার জন্য অনেকগুলি ত্রিভুজের প্রয়োজন হবে তাই আমরা পরিবর্তে একটি সাধারণ মানচিত্রে একটি উচ্চ-পলি জাল বেক করি। তারপর আপনি একটি সরলীকৃত জাল বেস মানচিত্র প্রয়োগ করতে পারেন. নিম্নলিখিত চিত্রটি সাধারণ ম্যাপিং ছাড়াই একটি সাধারণ জাল (বামে) এবং এটির সাথে (ডানে) তুলনা করে।
নোট করুন যে normal
সম্পত্তি বেস স্তরকে প্রভাবিত করে এবং পরিষ্কার কোট স্তরকে নয়।
পরিষ্কার কোট স্বাভাবিক
clearCoatNormal
বৈশিষ্ট্য একটি নির্দিষ্ট বিন্দুতে পরিষ্কার কোট স্তরের স্বাভাবিক সংজ্ঞায়িত করে। এটি অন্যথায় normal
সম্পত্তির মত আচরণ করে।
নির্গত
emissive
সম্পত্তি পৃষ্ঠ দ্বারা নির্গত অতিরিক্ত আলো অনুকরণ করতে ব্যবহার করা যেতে পারে। এটি একটি float4
মান হিসাবে সংজ্ঞায়িত করা হয় যাতে একটি RGB রঙ (লিনিয়ার স্পেসে) পাশাপাশি একটি এক্সপোজার ক্ষতিপূরণ মান (আলফা চ্যানেলে) থাকে।
যদিও একটি এক্সপোজার মান আসলে ক্যামেরা সেটিংসের সংমিশ্রণ নির্দেশ করে, এটি প্রায়শই ফটোগ্রাফাররা আলোর তীব্রতা বর্ণনা করতে ব্যবহার করেন। এই কারণেই ক্যামেরা ফটোগ্রাফারদের একটি ছবিকে বেশি বা কম প্রকাশ করার জন্য এক্সপোজার ক্ষতিপূরণ প্রয়োগ করতে দেয়। এই সেটিংটি শৈল্পিক নিয়ন্ত্রণের জন্য ব্যবহার করা যেতে পারে তবে সঠিক এক্সপোজার অর্জনের জন্যও ব্যবহার করা যেতে পারে (উদাহরণস্বরূপ তুষারটি 18% মধ্য-ধূসর হিসাবে উন্মুক্ত হবে)।
নির্গত সম্পত্তির এক্সপোজার ক্ষতিপূরণ মান বর্তমান এক্সপোজারের তুলনায় নির্গত রঙকে উজ্জ্বল (ইতিবাচক মান) বা গাঢ় (নেতিবাচক মান) হতে বাধ্য করতে ব্যবহার করা যেতে পারে। যদি ব্লুম প্রভাব সক্ষম করা হয়, তাহলে একটি ইতিবাচক এক্সপোজার ক্ষতিপূরণ ব্যবহার করে পৃষ্ঠটিকে প্রস্ফুটিত হতে বাধ্য করতে পারে।
কাপড়ের মডেল
পূর্বে বর্ণিত সমস্ত উপাদান মডেলগুলি ম্যাক্রো এবং মাইক্রো স্তরে উভয়ই ঘন পৃষ্ঠের অনুকরণ করার জন্য ডিজাইন করা হয়েছে। জামাকাপড় এবং কাপড়গুলি প্রায়শই আলগাভাবে সংযুক্ত থ্রেড দিয়ে তৈরি হয় যা ঘটনার আলোকে শোষণ করে এবং ছড়িয়ে দেয়। যখন শক্ত পৃষ্ঠের সাথে তুলনা করা হয়, তখন কাপড়টি একটি নরম স্পেকুলার লব দ্বারা চিহ্নিত করা হয় যার একটি বড় ফল অফ এবং ফাজ লাইটিং এর উপস্থিতি, যা সামনে/পেছন দিকে বিক্ষিপ্তভাবে সৃষ্ট হয়। কিছু কাপড় দুই-টোন স্পেকুলার রঙও প্রদর্শন করে (উদাহরণস্বরূপ মখমল)।
নিম্নলিখিত চিত্রটি স্ট্যান্ডার্ড মডেল (বাম) এবং কাপড়ের মডেল (ডান) ব্যবহার করে রেন্ডার করা ডেনিম ফ্যাব্রিকের তুলনা করে। লক্ষ্য করুন কিভাবে স্ট্যান্ডার্ড ম্যাটেরিয়াল মডেল ডেনিম ফ্যাব্রিকের একটি নমুনার চেহারা ক্যাপচার করতে ব্যর্থ হয় (বামে)। পৃষ্ঠটি অনমনীয় (প্রায় প্লাস্টিকের মতো), পোশাকের টুকরো থেকে টারপের মতো বেশি দেখায়। This also shows how important the softer specular lobe caused by absorption and scattering is to the faithful recreation of the fabric.
Velvet is an interesting use case for a cloth material model. As shown in the image below, this type of fabric exhibits strong rim lighting due to forward and backward scattering. These scattering events are caused by fibers standing straight at the surface of the fabric. When the incident light comes from the direction opposite to the view direction, the fibers will forward scatter the light. Similarly, when the incident light from from the same direction as the view direction, the fibers will scatter the light backward.
It is important to note that there are types of fabrics that are still best modeled by hard surface material models. For instance, leather, silk and satin can be recreated using the standard or anisotropic material models.
The cloth material model encompasses all the parameters previously defined for the standard material mode except for metallic and reflectance . Two extra parameters described in the table below are also available.
Parameter | Definition |
---|---|
sheenColor | Specular tint to create two-tone specular fabrics (defaults to \(\sqrt{baseColor}\)) |
subsurfaceColor | Tint for the diffuse color after scattering and absorption through the material |
The type and range of each property is described in the table below.
Property | Type | Range | Note |
---|---|---|---|
sheenColor | float3 | [0..1] | Linear RGB |
subsurfaceColor | float3 | [0..1] | Linear RGB |
To create a velvet-like material, the base color can be set to black (or a dark color). Chromaticity information should instead be set on the sheen color. To create more common fabrics such as denim, cotton, etc. use the base color for chromaticity and use the default sheen color or set the sheen color to the luminance of the base color.
Sheen color
The sheenColor
property can be used to directly modify the specular reflectance. It offers better control over the appearance of cloth and gives give the ability to create two-tone specular materials.
The following image compares blue fabric with and without (left) and with (right) sheen (click on the image to see a larger version).
Subsurface color
The subsurfaceColor
property is not physically-based and can be used to simulate the scattering, partial absorption and re-emission of light in certain types of fabrics. This is particularly useful to create softer fabrics.
The following image demonstrates the effect of subsurfaceColor
. It shows white cloth (left column) vs white cloth with brown subsurface scatting (right column). Click on the image to see a larger version.
Unlit model
The unlit material model can be used to turn off all lighting computations. Its primary purpose is to render pre-lit elements such as a cubemap, external content (such as a video or camera stream), user interfaces, visualization/debugging etc. The unlit model exposes only two properties described in the table below.
Property | Definition |
---|---|
baseColor | Surface diffuse color |
emissive | Additional diffuse color to simulate emissive surfaces. This property is mostly useful in an HDR pipeline with a bloom pass |
The type and range of each property is described in the table below.
Property | Type | Range | Note |
---|---|---|---|
baseColor | float4 | [0..1] | Pre-multiplied linear RGB |
emissive | float4 | rgb=[0..1], a=N/A | Pre-multiplied linear RGB, alpha is ignored |
The value of emissive
is simply added to baseColor
when present. The main use of emissive
is to force an unlit surface to bloom if the HDR pipeline is configured with a bloom pass.
The following image shows an example of the unlit material model used to render debug information (click on the image to see a larger version).
Handling colors
Linear colors
If the color data comes from a texture, simply make sure you use an sRGB texture to benefit from automatic hardware conversion from sRGB to linear. If the color data is passed as a parameter to the material you can convert from sRGB to linear by running the following algorithm on each color channel:
float sRGB_to_linear(float color) {
return color <= 0.04045 ? color / 12.92 : pow((color + 0.055) / 1.055, 2.4);
}
Alternatively you can use one of the two cheaper but less accurate versions shown below:
// Cheaper
linearColor = pow(color, 2.2);
// Cheapest
linearColor = color * color;
Pre-multiplied alpha
A color uses pre-multiplied alpha if its RGB components are multiplied by the alpha channel:
// Compute pre-multiplied color
color.rgb *= color.a;
If the color is sampled from a texture, you can simply ensure that the texture data is pre-multiplied ahead of time. On Android, any texture uploaded from a Bitmap will be pre-multiplied by default.