مقدمة في ال Rendering Pipeline

كأول مقال في تطوير الألعاب سوف اتطرق كيف تحدث معالجة البيانات حتى تظهر لنا صورة على الشاشة وبدون تفصيل في بعض الامور لان بعضها تحتاج مقالات حتى نغطيها .
الهدف من جميع العمليات القادمة هو تحويل البيانات الرقمية الى صورة 2d يمكن مشاهدتها على الشاشة ومن هنا نبدأ بال cpu حيث نحسب النقاط (vertices) و ونضيف لها خصائص مثل positions و  indices  و  vertices uv , vertices colors او texture mapping وبعض المعلومات الهندسية ونحدد طريقة ارتباط هذه النقاط ببعضها مثلثات او خطوط .

كل الخطوات السايقة يتم عملها عن طريق مكاتب ال rendering  مثل openGL . بعد ان ينتهي ال cpu بتحديد جميع البيانات السابقة يقوم بارسالها الى ال gpu حيث يقوم بال rendering ويتفرغ ال cpu للحسابات الأخرى وهذا مايعرف بالتزامن بين المعالجين asynchronous . يتصل اي برنامج بال gpu عن طريق مكاتب ال rendering حيث تتواصل هذه المكات مع graphics cards drivers والذي يقوم بدوره بتحويل الأوامر الى اكواد يفهمها ال gpu وتعرف المكاتب التي تقوم بهذا العمل باسم hardware abstracting layer ومثالها opengl or directx  . بعد ان ينتهي ال gpu من عمل ال rendering يقوم بابلاغ ال cpu بانه قد انتهى لينجح التزامن .

يحتوي ال كرت الشاشة بالاضافة الى وحدة المعالجة gpu الى ذاكرة vram تخزن بداخلها جميع البيانات التي يحتاجها ال gpu لعمل ال rendering .

vertex buffer جميع البيانات لل vertices التي قمت بارسلها  ال positions و indices  و  vertices uv , vertices colors

front and back image buffer or frame buffer اما ال front image buffer هي البكسلات الموجودة على ال viewport في الشاشة او اي target display or target texture . اما ال back image buffer فهي الصورة الجاري العمل عليها وعند الانتهاء منها يتم نسخها الى ال front image buffer كل هذا يعرض بالتزامن مع ال refresh rate للشاشة حتى لايحدث مايسمى بال tearing وهو تداخل اكثر من frame في نفس الصورة  .

depth buffer او z-buffer وبامانك تفعيلها او ايقافها هذه البيانات عبارة عن رقم لكل بكسل حيث تحدد عمقه بالنسبة للكاميرا الافتراضية وهي تفيد في رسم البكسلات حيث يظهر البكسل الأقل عمقا بالنسبة للكاميرا وحذف البكسل الأكثر عمقا .

stencil buffer وهو لعمل pixel mask قيمة رقمية لكل بكسل تساعد في عمل masking and maskend بين البكسلات حيث تعمل مقارنات بين البكسلات في نفس الموقع ويكون اساس هذه المقارنة هي القيمة الرقمية او ref وتحديد ماذا يحدث في حال فشل او نجاح هذه المقارنة

texture map هي الصور التي يتم تركيبها على الكائن بحيث تعطي له مزيد من التفاصيل وقد لاتكون بكسلات يتم رسمها على الشاشة ربما معلومات هندسية مثل bump map حيث كل بكسل يمثل vector تساعدك في عمل بروزات على الكائن .

Vertex Transformation

في النهاية نحن نريد ان نحول ال verticec مجموعة بكسلات ترسم على ال view port ولذلك قبل رسمها فاننا يجب عمل مجموعة تحويلات على كل vertex في الذاكرة والتي هي في الحقيقة مجرد ضرب مصفوفات .
كما هو موضح في الرسم يستقبل ال gpu ال vertex باحداثياته local position .
في ال view port or clip space جميع القيم x,y,z يجب ان تكون بين [-1,1] حتى تتمكن من رسمها على rendering target .

Rasterization and Fragment Operations

بعد ان انتهينا من العمليات على ال vertices وتم تحويلها الى احداثيات على الشاشة او غيرها نحن بحاجة لتحديد ماهي البكسلات التي تغطي كل شكل (primitive graphics) وهنا ننتقل الى مايسمى rasterization ومهمته تغطية primitive graphics بشكل كامل بالبكسلات … بعد تحديد موقع كل pixel يقوم ال gpu اضافة معلومات عليه مثل العمق وال texture coordinates للبكسل وهذ المعلومات كحزمة واحدة تسمى fragment والتي سيتم ارسالها الى مايسمى fragment shading .

The process of filling in the horizontal spans of pixels belonging to a primitive is called rasterization.

The GPU calculates the depth, interpolated vertex colors, and interpolated texture coordinates for each pixel. This information, combined with the location of the pixel itself, is called a fragment.

عملية تحويل primitive graphics الى مجموعة fragments تحدث فقط primitive graphics التي وجه مضلعاتها ضمن ال face culling سواء back face او front face ويتم استثنا عمل fragments للمضلعات الأخرى .
كل fragment يدخل في برنامج يسمى fragment shading مع مجموعة البيانات المرافقة له ليمكنك من عمل التأثيرات على البكسلات وتحديد لونها او جلب اللون من ال texture او عمل تأثيرات اكثر تعقيدا مثل الاضاءة .
وبعد انتها برنامج الfragment shading يمر بمجموعة عمليات fragments operations وهي اختبارات تحدد ماهو الfragment الذي يتم رسمه وطريقة رسمه او يتم حذف ال fragment …
pixel ownership test هي عملية اجبارية ولا يمكن تعطيلها وهو يتحقق هل يقع ال pixel ضمن مساحة ال view port سواء شاشة او غيرها .
Scissor test بامكان التطبيق تحديد مستطيل لا يمكن للمحتوى ان يرسم خارجه وفي حال حدث يتم حذف ال ragment .
Alpha Test يتم اختبار قيمة الفا لكل لون بكسل في حال حقق الشرط المطلوب فانه يرسم والا يتم حذفه .
stencil test mask and masked اختبار stencil تحدثنا عنه مسبقا في ذات المقال وان شاء الله التفصيل في مقالات أخرى.
depth test or ZTest يتم تحديد ماهو البكسل الذي يتم رسمه الأقل عمقا ام الأكثر عمقا او في حال التساوي الخ .
Blending وهنا تتم عملية حسابية بين لون البكسل الموجودة مسبقا في ال image buffer واللون الحالي لتحدد طريقة اندماجهم وهو يستخدم في الغالب مع عناصر ال transparency وهي في العادة اخر مايتم رسمه في المشهد قبل طبقة  ال overlay

وبعد كل هذا تنتقل الصورة من ال back image buffer الى front image buffer لتشاهدها .