- 3D koodinatları 2D piksellere dönüştürme işlemi, OpenGL'in graphics pipeline tarafından yönetilir.
- Graphics pipeline
- Vertex Shader
- Shape Assembly
- Geometry Shader
- Rasterization
- Fragment Shader
- Tests and Blending
- Kendi shaderlarımızı yazabileceğimiz bölümler:
- Vertex Shader
- Geometry Shader
- Fragment Shader
- Örneğin üçgen çizdirmek istersek yapmamız gereken verileri tanımlamak:
- VBO oluşturmak
- Bu VBO'ya unique id vermek (glGenBuffers(size, &VBO))
- Belli bir VBO buffer tipi ile bağlamak. (glBindBuffer(GL_ARRAY_BUFFER, VBO))
- Sonrasında tanımlanan veriyi bu bağlanmış olan VBO'ya göre o buffer tipine veri yüklemeyi gerçekleştirmek. (glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW*3 form alabilir*))
- Yazılan shader programlarda kullanılan dil GLSL'dir.
- Attribute tanımlarken in keyword kullanılır.
- Attribute değişkenin konumu layout (location = x) in vec3 a_variableName; şeklinde belirtilir.
- OpenGL'de render olmadan önce vertex data nasıl yorumlanması gerektiği programcı tarafından belirtilmelidir. Örneğin VBO'da yer alan verinin yapısı şu şekilde olsun:
- Stride: 12
- offset: 0
- Vertex 1
- x1 → 4 byte (32-bit float) [0-4]
- y1 → 4 byte (32-bit float) [4-8]
- z1 → 4 byte (32-bit float) [8-12]
- Vertex 2
- x2 → 4 byte (32-bit float) [12-16]
- y2 → 4 byte (32-bit float) [16-20]
- z2 → 4 byte (32-bit float) [20-24]
- Vertex 3
- x3 → 4 byte (32-bit float) [24-28]
- y3 → 4 byte (32-bit float) [28-32]
- z3 → 4 byte (32-bit float) [32-36]
- Bu bilgiler ışığında vertex data'nın nasıl yorumlanması gerektiğini glVertexAttribPointer fonksiyonu ile söyleriz:
- glVertexAttribPointer(x, 3(size), GL_FLOAT(data_type), GL_FALSE(normalized), 3*sizeof(float)(stride),(void*)0(offset));
- x olarak temsil edilen parametre attribute location değeridir. Bu sayede hangi veriyi yapılandırmak istediğimizi belirtiyoruz. Konumunu ne olarak belirtmişsek o konumu vermeliyiz.
- glVertexAttribPointer verileri hangi buffer GL_ARRAY_BUFFER'a bağlıysa ondan veriyi alır.
- Vertex Attribute'lar default olarak devre dışıdır. Bu sebeple kullanabilmek için aktif edilmelidirler. Bunun glEnableVertexAttribArray(x) kullanılır.
- VAO kullanımı ise bundan sonra ihtiyaç haline gelmektedir. VAO için VBO'ların depolandığı bir nesne olarak bahsedebiliriz. Bu nesne içinde positions, colors, normal vectors, texture_coords gibi veriler barındıran VBO olarak depolanmaktadır. VAO yani Vertex Array Object aslında bir attribute liste yapısıdır.
- Bir şeyi çizmeden önce şu adımları uygulayabiliriz:
- VAO, VBO oluşturulur.
- VAO bağlanır.
- VBO bağlanır.
- VBO'ya ilgili veri verilir.
- Veri uygun şekilde yorumlanır.
- Döngü içinde VAO bağlanır.
- Çizim metodu kullanılır.
Günlük Kayıt #1
Kaydol:
Kayıt Yorumları (Atom)
Hiç yorum yok:
Yorum Gönder