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

في هذه المقالة سوف نتعرف على اهم عملية على ال vertices وهو استخدام مصفوفة ال transforming مع النقاط والمتجهات ومتجهات ال normal .
بالنسبة لكل كائن هناك مصفوفتان تساعدانه في حساب نقاطه ومتجهاته الاولى local to world وهي المصفوفة التي ضربناها بنقاطه ليصل للمكان الذي هو حاليا فيه وفي حال كان هناك local داخل local فانك تبدا بضرب المصفوفات بالنقطة من اصغر local الى ان تصل الى ال world ,  والثانية world to local وهي المعكوس الضربي للمصوفة local to world .

$ P_1 $  is Point in world space in same time its local =\begin{bmatrix} 0\\0\\0\\1 \end{bmatrix}
$ P_2 $  is Point in local space of $ P_1 $
let $ A $  is world to local matrix of $ P_1 $
then we can say $ P_2=MAP_1$ M is matrix of transform 4×4
then P_2=MAP_1$=M\begin{bmatrix} 0\\0\\0\\1 \end{bmatrix}
we know \begin{bmatrix} 0\\0\\0\\1 \end{bmatrix} is local position of $ P_1 $ in $ P_1 $ then M\begin{bmatrix} 0\\0\\0\\1 \end{bmatrix} is local position of $ P_2 $ in $ P_1 $
we know $ A^{-1} $  is local to world matrix of $ P_1 $  it is opposite of $ A $
$(A)^{-1}P_2=(A)^{-1}MAP_1=A^{-1}M\begin{bmatrix} 0\\0\\0\\1 \end{bmatrix} $

المعادلات السابقة ملخص لفكرة local to world , world to local  والآن سوف نرى كيف نتعامل مع نقطة ومع متجه ومع متجه ال normal

 

عمل transform لنقطة وذلك بضرب مصفوفة ال transform بالنقطة


float4x4 mymatrix;
float4 point;
float4 transformed_point = mul(mymatrix, point);

or
float4x4 matrix_transpose;
float4 point;
float4 transformed_point = mul(point, matrix_transpose);

 

عمل transform لل direction

float3x3 mymatrix;
float3 direction; 
float3 transformed_direction = mul(mymatrix, direction);

or

float4x4 mymatrix;
float3 direction;
float4 transformed_direction = mul(mymatrix, float4(direction, 0.0));

or

float3x3 mymatrix;
float4 direction; // 4th component is 0
float4 transformed_direction = float4(mul(mymatrix, direction.xyz), 0.0);

 

عمل transform لل normal direction

float3x3 matrix_inverse_transpose;
float3 normal;
float3 transformed_normal = mul(matrix_inverse_transpose, normal);

or

float4x4 matrix_inverse_transpose;
float3 normal;
float3 transformed_normal = mul(matrix_inverse_transpose, float4(normal, 0.0)).xyz;

or

float3x3 matrix_inverse;
float3 normal;
float3 transformed_normal = mul(normal, matrix_inverse);

or

float4x4 matrix_inverse;
float4 normal;
float4 transformed_normal = float4(mul(normal, matrix_inverse).xyz, 0.0);

للتعمق اكثر في الموضوع اليك الرابط التالي
https://en.wikibooks.org/wiki/Cg_Programming/Applying_Matrix_Transformations