Graphic pipeline (renderin pipeline), 3D bir sahnenin 2D olarak render alınması için gereken adımlardır. Aşağıda (basitleştirilmiş) bir graphics pipeline görüyoruz. Mavi olanlar programlanabiliri shader’lardır. Bizler için şuanlık önemli olan vertex shader ve fragment shader adımlarıdır. Modern OpenGL’i kullanabilmemiz için en azından bu iki shader’ı yazmamız gerekli.
Yukarıdaki adımları kısaca anlatalım:
Vertex shader temel olarak 3D koordinatları başka 3D koordinatlara çevirir veya olduğu gibi bırakabilir. Bu arada vertex attribute’ler üzerinde bazı temel işlemler yapabiliriz. Buradaki amaç noktaların nerede olduğunun belirlenmesidir. Örneğin üçgen çizmek için 3 tane noktaya ihtiyacımız var. Bu 3 noktanın nerede olması gerektiğini burada belirliyoruz.
Primitive assembly: vertex shader’dan çıkan noktaları istenilene göre birbirine bağlayarak primitive oluşturur. Örneğin GL_TRIANGLES olacak dersek. 1,2,3 noktayı 1. üçgen 4,5,6 noktayı 2. üçgen … olaracak şekilde tanımlar.
Geometry shader: Bu shader opsiyoneldir yani kullanılmak zorunda değil. Her geometry shader çağrısından 1 primitive girdi olarak alınır ve 0 veya daha fazla primitive çıktı olarak verilir. Uygulamaya bağlı olarak tek bir çağrıdan kaç primitive oluşturabileceği kısıtlıdır. (There are implementation-defined limits on how many primitives can be generated from a single GS invocation.)
Rasterization; vektör grafiğin, raster görüntüye çevrilmesi. Yani elimizde matematiksel olarak nerede olduğunu bildiğimiz üçgenler bulunmakta. Bu üçgenlerin hangi piksellere karşılık geleceğini buluyoruz. (aslında piksel demek yanlış “fragment” diyoruz. Fragment ile piksel farklı kavramlar.)
Fragment shader bir önceki bölümde oluşturulmuş fragmentların rengini (ve depth değerlerini) işler/belirler.
Son olarak depth test, blending vb işlemler yapılır.
Resources
- https://en.wikipedia.org/wiki/Graphics_pipeline
- https://learnopengl.com/Getting-started/Hello-Triangle
- https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview
Leave a Reply