برمجة ال shader باستخدام ال CG الدرس الخامس

في نهاية الدرس الأول من دروس ال cg كتبنا الكود التالي

float4 vert(float4 pos:POSITION):SV_POSITION
{
	return mul(UNITY_MATRIX_MVP,pos);
}

fixed4 frag(void):COLOR
{
	return fixed4(1,1,1,1);
}

موضوعنا في هذا الدرس يتمحور حول سطر واحد

mul(UNITY_MATRIX_MVP,pos);

حيث قمنا بنقل احداثيات ال vertex من local الى احداثيات ال viewport , وهي في الحقيقة مجموعة مصفوفات نضربها في ال vertex .

  1. positioning the model — modeling transformation
  2. positioning the camera — viewing transformation
  3. adjusting the zoom — projection transformation
  4. cropping the image — viewport transformation

اول ثلاثة مصفوفات من المصفوفات الاربعة يتم تنفيذها داخل برنامج ال vertex وهي modeling,viewing,projection واختصارها MVP وهذا ماتمثله UNITY_MATRIX_MVP .
الرسم التالي يوضح تستلسل التحويل لل vertex
ومن هنا نبدا نفصل في المصفوفات الثلاثة

 

modeling transformation وهي المصفوفة التي تحول الاحداثيات من local to world وتهتم بثلاثة جزئيات في الغالب translate and scale and rotation

viewing transformation وهي المصفوفة التي تحول الاحداثيات من world to view وافتراضيا هي نفس مصفوفة ال world to local بالنسبة لكائن الكاميرا مع تغير في اتجاه ال z بضرب الصف الثالث من المصفوفة ب -١ .

 

projection transformation وهي مصفوفة تمثل الهرم الناقص الساقط من الكاميرا (frustum)  وتكون على شكلين perspective or orthogonal .

ال perspective تحتوي على ثلاثة عناصر مهمة على اساسها يمكن عمل مصفوفة ال projection
field of view  وهي زاوية الرؤية لل frustum

    $$y=ztan(fov/2)$$

aspect ratio وهي نسبة x الى y  بالنسبة لل frustum

    $$x=ay$$

near plane and far plane ونرمزلهم ب n and f
من المعلومات السابقة يمكن الحصول على ال projection matrix

     $$ M_{projection}=\begin{bmatrix} \frac{1}{x}&0&0&0\\ 0&\frac{1}{y}&0&0\\ 0&0&\frac{n+f}{n-f}&\frac{2nf}{n-f}\\ 0&0&-1&0 \end{bmatrix} $$

orthographic يعتمد في تحديد ال projection matrix على تقاطع ال planes كما في الرسم
ويتميز orthographic عن ال perspective بانه اقل تعقيدا في الحساب فهو لا يحتاج لتغيير موقع x و y  حسب العمق .

طريقة حساب موقع x او y واحدة

     $$x'=\frac{2(x-\frac{r+l}{2})}{r-1}$$

في الغالب وافتراضيا $r+l=0$ ولكن في حال حدوث ازاحة فانه يجب طرح هذه الازاحة من قيمة$x$

 

 

 

 

وبذلك تكون انتهت جميع الحسابات داخل برنامج ال veertex وللمزيد اقرأ https://en.wikibooks.org/wiki/Cg_Programming/Vertex_Transformations .