Bilgisayar Grafikleri Ders 12: OpenGL_5 Örnekler Doç. Dr. Cemil Öz Bilgisayar Grafikleri Ders 12: OpenGL_5 Örnekler SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
OpenGL Temel Çizim Örnekleri Boş pencere Oluşturma Pencere oluşturmak için glut(openGL araç takımı) fonksiyonlarını kullanıyoruz. Glut ile işletim sistemi penceresi değil kendi penceremizi oluşturuyoruz. Böylece her işletim sisteminde derlenerek çalıştırılabilir.
#include <windows.h> #include<math.h> #include<gl.h> #include<glu.h> #include<glut.h> #pragma comment(lib,"opengl32.lib") #pragma comment(lib,"glu32.lib") #pragma comment(lib,"glut32.lib") void ayarlar() { glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_FLAT); } void gosterim() glClear(GL_COLOR_BUFFER_BIT); glFlush(); int main(int argc, char** argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); // diplay modunu set etme glutInitWindowSize(800,600); // pencere boyutunu belirleme glutInitWindowPosition(10,10); glutCreateWindow(" Çizim örneği"); ayarlar(); glutDisplayFunc(gosterim); glutMainLoop(); return 0;
Bazı fonksiyonların açıklaması glutInit(&argc, argv): glut fonksiyonlarını başlatmak için kullanılır. glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB): pencerenin nasıl bir renk kipine, tek veya çift arabellekli olup olmayacağınaveya pencereye derinlik sağlanıp sağlanmayacağı belirlenir. Tek arabellekte çizim komutlarının işlevi hemen uygulanır. Arkasından başka bir komut geldiğinde önceki silinir yerine yeni olanın işlevi görüntülenir. Bu görüntü oluşturmada ekran titremelerine sebep olur. Bu yüzden çift arabellek kullanılır. Böylece titreşim engellenir. Çizimler ayrı bir çizim belleğinde gerçekleştirilir tamamlandığında ekrana bastırılır. GLUT_RGBA : Kırmızı, yeşil, mavi ve alfa(geçirgenlik) renk modunda pencere açar. GLUT_RGBA : Kırmızı, yeşil, mavi renk modunda pencere açar. GLUT_INDEX :Renk sıralama kipini seçer. GLUT_DOUBLE :Çift ara bellekli bir pencere oluşturur. GLUT_SINGLE : Tek ara bellekli bir pencere oluşturur. GLUT_ACCUM :ara bellekli bir pencere açar ve depolar. GLUT_ALPHA : renk arabelleğinde alfa bileşenli bir pencere oluşturur. GLUT_DEPTH : derinlik arabellekli bir pencere oluşturur.
glutInitWindowSize(800,600): fonksiyon ile pencere boyutları belirlenir.pencere boyutu 800’e 600 piksel olarak verilmiştir. glutInitWindowPosition(200,250): penceremizin konumlanacağı ekran koordnatını belirtiriz. glutCreateWindow(" Çizim örneği"): Çizim örneği başlıklı bir pencere verilen boyut, pozisyon ve özellikte oluştururlur.
NOKTA verilecek program oluşturulan pencereye dört adet nokta oluşturur. Bilindiği üzere OpenGL komutları glBegin() ile başlar ve glEnd() ile biter. Burada noktaçizmek için glBegin(GL_POINTS);//Nokta için glVertex2f(0.5, 0.5);glVertex2f(0.0, 0.5); glVertex2f(0.5, 0.0);glVertex2f(0.0, 0.0); glEnd(); ifadeleri kulanılacaktır. glVertex2f(0.5, 0.5) komutu nokta olduğunu, parametrelerin ondalık olduğunu ve noktanın x koordinatının 0.5, y koordinatınında 0.5 olduğunu belirtir.
#include <math.h> #include <glut.h> void Ciz(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1.0,0.0,0.0);//kırmızı renk glBegin(GL_POINTS);//Nokta için glVertex2f(0.5, 0.5);glVertex2f(0.0, 0.5); glVertex2f(0.5, 0.0);glVertex2f(0.0, 0.0); glEnd(); glutSwapBuffers(); } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Üçgen"); glutDisplayFunc(Ciz); glutIdleFunc(Ciz); glEnable(GL_DEPTH_TEST); glutMainLoop();
Çizgi(doğru) Çizimi Verilecek olan program oluşturulan pencereye doğru çizer. Bilindiği üzere OpenGL komutları glBegin() ile başlar ve glEnd() ile biter. Burada doğru çizmek için glBegin(GL_LINES);//çizgi çizmemize yarayan komut glVertex2f(-0.5,0.0); glVertex2f(0.5,0.0); glEnd(); ifadeleri kulanılacaktır. Bilindiği üzere iki nokta birleştirilerek bir doğru çizilebilir. Burada verilen iki nokta birleştirilerek bir doğru elde edilir
#include <math.h> #include <glut.h> void Ciz(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1.0,0.0,1.0);//Mor renk glBegin(GL_LINES);//çizgi çizmemize yarayan komut glVertex2f(-0.5,0.0); glVertex2f(0.5,0.0); glEnd(); glutSwapBuffers(); } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Üçgen"); glutDisplayFunc(Ciz); glutIdleFunc(Ciz); glEnable(GL_DEPTH_TEST); glutMainLoop();
Üçgen çizimi verilecek program oluşturulan pencereye üçgen çizer. Bilindiği üzere OpenGL komutları glBegin() ile başlar ve glEnd() ile biter . burada üçgen çizmek için glBegin(GL_TRIANGLES);//üçgen çizme komutu glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); ifadeleri kulanılacaktır. Bilindiği üzere üç nokta birleştirilerek bir üçgen çizilebilir. Burada verilen üç nokta birleştirilerek bir üçgen elde edilir programın tamamı ise aşağıda verilmiştir.
#include <math.h> #include <glut.h> void Ciz(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1.0,1.0,0);//sarı renk glBegin(GL_TRIANGLES);//üçgen çizme komutu glVertex3f(-0.5,-0.5,0.0); glVertex3f(0.5,0.0,0.0); glVertex3f(0.0,0.5,0.0); glEnd(); glutSwapBuffers(); } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Üçgen"); glutDisplayFunc(Ciz); glutIdleFunc(Ciz); glEnable(GL_DEPTH_TEST); glutMainLoop();
KARE VEYA DİKDÖRTGEN verilecek program oluşturulan pencereye Kare veya dikdörtgen çizer. Bilindiği üzere OpenGL komutları glBegin() ile başlar ve glEnd() ile biter . burada Kare veya dikdörtgen çizmek için glBegin(GL_QUADS); glVertex2f(1.0,1.0); glVertex2f(1.0,0.0); glVertex2f(0.0,0.0); glVertex2f(0.0,1.0); glEnd(); ifadeleri kulanılacaktır. Bilindiği üzere dört nokta birleştirilerek bir dörtgen çizilebilir. Burada verilen dört nokta birleştirilerek bir dörtgen elde edilir. glBegin(GL_QUADS) fonksiyonun içerisine parametre olarak GL_QUADS verilmektedir.
#include <math.h> #include <glut.h> void Ciz(void) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glColor3f(1.0,0.0,1.0);//Mor renk glBegin(GL_QUADS); glVertex2f(1.0, 1.0); glVertex2f(1.0, 0.0); glVertex2f(0.0,0.0); glVertex2f(0.0,1.0); glEnd(); glutSwapBuffers(); } void main(int argc, char **argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA); glutInitWindowPosition(100,100); glutInitWindowSize(320,320); glutCreateWindow("Üçgen"); glutDisplayFunc(Ciz); glutIdleFunc(Ciz); glEnable(GL_DEPTH_TEST); glutMainLoop();
Çember çizimi Çember çizimi, dörtgen veya üçgen çizme gibi basit koordinatları girilerek oluşturulan bir çokgen değildir. Kareyi düşünürsek dört noktadan oluşur, noktaları artırırsak bu çembere benzeyecektir. Dolayısı ile belli açılarda noktalar çizilir ve bunlar doğrularla birleştirilirse çember elde edilebilir. X=a*cos(x) Y=b*sin(x) X açı, a ve b ise parametredir. A ve b eşit ise çember aksi durumda elips olur. Yani çember için X=r*cos(x) Y=r*sin(x) Diyebiliriz Sin() ve cos() fonksiyonları Math.H kütüphanesinde ve radyan cinsinden açı değerleri ile çalışmaktadır. Bu yüzden açı değerini radyana dönüştürmek gerekir. 180 Pİ ise Y x dir. Ozaman da x=y*Pİ()/180 den verilen y cinsinden açının x radyan karşılığını bulabiliriz.
Burada glBegin(GL_LINE_LOOP); for(aci=0;aci<=360;aci++) { radyan=aci*3.1416/180; glVertex2f(cos(radyan)*0.6,sin(radyan)*0.6); } glEnd() İçi boş cember çizecektir. Yani noktaları bir birine bağlayacaktır. Çemberin dolu olabilmesi için glBegin(GL_POLYGON); GL_POLYGON parametresi ile içi dolu daire çizilecektir.
#include<math.h> #include<glut.h> void ayarlar() { glClearColor(1.0,1.0,1.0,1.0); glShadeModel(GL_FLAT); glPolygonMode(GL_FRONT,GL_FILL); } void cember() glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0,0.0,1.0); double radyan=0; int aci=0; glBegin(GL_LINE_LOOP); for(aci=0;aci<=360;aci++) radyan=aci*3.1416/180; glVertex2f(cos(radyan)*0.6,sin(radyan)*0.6); glEnd() glFlush();
int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); // diplay modunu set etme glutInitWindowSize(800,600); // pencere boyutunu belirleme glutInitWindowPosition(10,10); glutCreateWindow(" cember örneği"); ayarlar(); glutDisplayFunc(cember); glutMainLoop(); return 0; }