Bu Blogda Ara

opengl etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
opengl etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

14 Nisan 2011 Perşembe

IREM Oyun Motoru Çalışması - Rapor 1

Herkese merhaba,

bu yazımda bitirme projesi olarak yaptığımız IREM Oyun Motoru projesinden bahsetmek istiyorum. Bu projeyi üniversite lisans bitirme projesi olarak toplam 4 kişilik bir ekip ile yapıyoruz. Profesyonel düzeyde bir proje olduğunu söyleyemem, fakat elimizden geldiğince gelişime açık bir tasarım ve esnek bir kodlama yapmaya çalışıyoruz. Proje henüz sonuçlanmadı fakat dönem sonuna doğru yaklaştıkça zaman kısıtı yüzünden projeyi bir noktada sınırlayıp nihayete erdirmek zorundayız. Gelin şuan ki aşamaya kadar neler yaptığımıza bir göz atalım.

Teknik Alt Yapı ve Sınırlar
C++ programlama dili üzerinden kodlamayı gerçekleştirdik. Grafik arayüzü olarak Microsoft DirectX API kullandık. Proje dahilinde singleton, façade, strategy, abstract factory vb. tasarım desenleri uygulandı. Networking, AI (yapay zeka), 3d sound, shader effects (HLSL) gibi modüllerin yalnızca tanımlaması yapıldı gerçeklenmedi. İleriki aşamalarda mevcut kod değiştirilmeden rahatlıkla bu modüller gerçeklenebilir. Fiziksel etkileşim yalnızca çarpışma testi ve parçacık dinamiği üzerinden gerçeklendi.

Teknik Üst Yapı ve Tasarım
Geliştirdiğimiz oyun motorunun temel fikri; yaklaşık olarak %90 seviyesinde nesne yönelimli, kolay programlanabilir, anlaşılır ve çevik (agile) geliştirmeye açık bir tasarım sağlamaktır. Bu yüzden inceledeğim bir çok modern oyun motorlarından da esinlenerek birbiriyle alakası olmayan tüm işlemleri ayırarak kendi aralarında bir yönetici sınıf atadım. Bu yönetici sınıflar singleton tasarım şablonu ile yalnız ve tek bir adet üretilerek çok başlılık sorununa mahal vermeden işlem yapmaktadır. Bu noktada sizlerle daha projenin ilk aşamalarında şekillendirmek adına çıkarttığım sınıf tasarımını paylaşmak istiyorum. İsterseniz tasarıma bir göz atalım, böylelikle kurgu kafamızda biraz daha somutlaşacaktır, daha sonra detaylı incelemeye devam edelim.



Buradaki bazı sınıfın yapısı değişmiş ve yine burada belirtmediğim bir çok yeni sınıf eklenmiş olsa da sistemin genel mantığını ifade ettiğini düşünüyorum.

Çekirdek uygulamanın yanında ek olarak pencere yöneticisi (window manager) ve arazi üreticisi (terrain generator) gibi araçlar geliştirdik. Bunlar programcıya hız kazandıracak araçlardır.

Son Durum & Karşılaştığımız Sorunlar
Gelelim şuanda projenin ne aşamada olduğu ve ne gibi sorunlarla karşılaştığımız kısmına. Projede şu anda çekirdek sınıf vasıtasıyla bir oyun işlemi başlatıp, sahne yöneticisi sınıfı vasıtasıyla istediğimiz sayıda birbirinden bağımsız sahneler üretebiliyoruz. Bu sahneler arasında gecikme olmaksızın anlık geçişler yapabiliyoruz. Çizdirilebilir nesne sayısı çok fazla olduğundan yavaşlayan bir sahne diğer bir sahneyi etkilememektedir. Sahneye eklediğimiz nesneleri kök düğüme ya da alt düğümlerine bağlayabiliyoruz. Böylelikle nesneleri grup olarak hareket ettirebiliyoruz. Kamera, ışık, model ve sabit nesneler sahneye eklebilmektedir. Uygulama başlatılmadan önce ayar penceresi gösterilerek seçilen ayarlar bir akış üzerinden kaydedilip okunabilmektedir.

Bir kaç model ile oyun motorunun işlevsel sınamalarından bir kare.




Karşılaştığımız başlıca teknik sorun kurduğumuz yapıyı sürekli yeniden değiştirme gereği duymamızdır. Daha önce tecrübe edinmediğimiz için modern yapıları inceledikçe yeni yöntemler keşfedip, kendi projemizdeki eski yapıları atma ihtiyacı duyuyoruz. Sosyal açıdan en büyük sorun ekip çalışmasının getirdiği zorluklar olarak tarif edebilirim.


Geleceğe Dair Planlar
Projeye ileriki aşamalarda yapmak istediğim eklemeleri şu şekilde sıralayabilirim:

- OpenGL desteği ile platform bağımsız tasarıma geçerek MacOS X, Linux, BSD, iPhone OS, PlayStation 3 gibi sistemlerde çalışmasını sağlamak.
- Çok kanallı programlama desteği sağlamak
- Shader desteği
- Gerçek zamanlı 3D model ve sahne düzenleme aracı
vs..


Bir sonraki yazımda da projemizdeki yenilikleri ve gelişmeleri sizlerle paylaşmaya devam edeceğim. Esen kalın efendim...

22 Aralık 2010 Çarşamba

Oyun Programlama Seminerleri (5. Oturum)



About this playlist

9 videos
Total length: 1 hour, 26 minutes

Description: Sakarya Üniversitesi Bilgisayar Mühendisliği 3 Boyutlu Oyun Motoru Programlama Seminerleri 5. Oturumu
Oturum Konusu: OpenGL
Toplam Uzunluk: 01:30:30

21 Aralık 2010 Salı

Oyun Programlama Seminerleri (4. Oturum)



About this playlist

9 videos
Total length: 1 hour, 31 minutes

Description:
Sakarya Üniversitesi Bilgisayar Mühendisliği 3 Boyutlu Oyun Motoru Programlama Seminerleri 4. Oturumu
Oturum Konusu: Sayısal Sistemler ve Sistem Programlama
Toplam Uzunluk: 01:31:46

5 Aralık 2010 Pazar

Drawing a Text on Screen in an OpenGL Application


Drawing a text on screen is a very general problem when you first start OpenGL. Conversely, it is simple to implement. I tried to make it possible with a little function as I show in the video above. Please note that it is required GLUT library to generate fonts. Do not forget to include to your project. I used SDL to manage Windows but it is optional for you.

Here is the code:


#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <SDL.h>
#include <gl\GL.h>
#include <gl\GLU.h>
#include <glut.h>
#include <math.h>
#include <cstring>



#pragma comment(lib,"opengl32.lib")
#pragma comment(lib,"glu32.lib")


/*
Drawing text 2D screen.
*/
void drawText(const char *text, int length, int x, int y){
glMatrixMode(GL_PROJECTION); // change the current matrix to PROJECTION
double matrix[16]; // allocate 16-byte in memory (thanks to BlueByteGames about memory-leak warning comment on YouTube)
glGetDoublev(GL_PROJECTION_MATRIX, matrix); // get the values from PROJECTION matrix to local variable
glLoadIdentity(); // reset PROJECTION matrix to identity matrix
glOrtho(0, 800, 0, 600, -5, 5); // orthographic perspective
glMatrixMode(GL_MODELVIEW); // change current matrix to MODELVIDE matrix again
glLoadIdentity(); // reset it to identity matrix
glPushMatrix(); // push current state of MODELVIEW matrix to stack
glLoadIdentity(); // reset it again. (may not be required, but it my convention
glRasterPos2i(x, y); // raster position in 2D
for(int i=0; i<length; i++){
glutBitmapCharacter(GLUT_BITMAP_9_BY_15, (int)text[i]); // generation of characters in our text with 9 by 15 GLU font
}
glPopMatrix(); // get MODELVIEW matrix value from stack
glMatrixMode(GL_PROJECTION); // change current matrix mode to PROJECTION
glLoadMatrixd(matrix); // reset
glMatrixMode(GL_MODELVIEW); // change current matrix mode to MODELVIEW
}

void DrawScreen(SDL_Surface* screen, int h)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

gluLookAt(0,0,-10, 0,0, 3, 0, 1, 0);

glColor3f(1,0,0);

glBegin(GL_LINES);
glVertex3f(0,0,0);
glVertex3f(1,0,0);
glEnd();

std::string text;
text = "This is a simple text.";
glColor3f(0, 1, 0);
drawText(text.data(), text.size(), 50, 200);


SDL_GL_SwapBuffers();
}

static void reshape(int width, int height)
{
GLfloat h = (GLfloat) height / (GLfloat) width;
glViewport(0, 0, (GLint) width, (GLint) height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective( 45.0, h, 1.0, 1000.0 );
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

SDL_Surface *surface;
int main(int argc, char **argv)
{

if (SDL_Init(SDL_INIT_VIDEO || SDL_INIT_AUDIO)<0)
{
return 1;
}

surface = SDL_SetVideoMode(800, 600, 32, SDL_OPENGL | SDL_RESIZABLE | SDL_DOUBLEBUF);
glShadeModel(GL_SMOOTH);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);


glLineWidth(1.5f);


glMatrixMode(GL_MODELVIEW);

reshape(800,600);
SDL_Event event;

int keypress = 0;
int h=0;

while(!keypress)
{

while(SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
keypress = 1;
break;
case SDL_KEYDOWN:
switch(event.key.keysym.sym){
case SDLK_LEFT:

break;
case SDLK_RIGHT:

break;
case SDLK_UP:

break;
case SDLK_DOWN:

break;
default:
break;
}
default:
break;
}

}
DrawScreen(surface,h++);
}

SDL_Quit();
return 0;
}

30 Ekim 2010 Cumartesi

Game Engine Programming



3 Boyutlu Oyun Motoru geliştirme seminerim önümüzdeki Salı günü (2 Kasım 2010) başlayacağını büyük bir mutlulukla duyurmak isterim :) Sau Bilgisayar Topluluğu bünyesinde gerçekleştilecek olan organizasyon için zaman 13:00~15:00 saatleri arası (D8 binası - sınıf henüz bana bildirilmedi) şeklinde düşünüldü. Ders yoğunluğuna bakarak en uygun zaman seçilmeye çalışıldı. Bu aralıkta dersi olan arkadaşlardan özür diliyorum. Eğer bir aksilik çıkmaz ise her salı bu seminerler düzenlenecek. Seminerlerle ilgili her türlü görüş ve eleştirilerinizi yorum olarak bu girdinin peşine bekliyorum.

Salı günü görüşmek üzere efendim. :)




-------02.11.2010------------------------------
İlk eğitimin başarılı geçtiğine inanıyorum. Katılan tüm arkadaşlara teşekkür ederim.
1. hafta sunum dosyasını buraya tıklayarak indirebilirsiniz.

Eğitimin bundan sonraki haftalarında tüm etkinliğin kameraya çekilmesi düşünülüyor. Ben de faydalı olacağına inanıyorum.

Haftaya aynı saatte görüşmek üzere.
-----------------------------------------------

-------09.11.2010------------------------------
İkinci hafta eğitim sunumları için:
sunum2
sunum3

sunumda kullanılan videolar:
Blender
Cry Engine 3
UDK

ayrıca sunumun bir kısmı video kameraya çekilmiştir. Görüntüler henüz elime ulaşmadı. Çekim yapan arkadaştan elde ettiğim zaman paylaşacağım.

Katılan herkese teşekkür ederim. Bayramdan sonraki hafta görüşmek üzere.

-------23.11.2010---------------------------------------
sunum4

Eğitim Videoları (YouTube)


Makine dilinde derleyicisiz yazdığımız uygulama.


--------------------------------------------------------



About this playlist

9 videos
Total length: 1 hour, 26 minutes

Description: Sakarya Üniversitesi Bilgisayar Mühendisliği 3 Boyutlu Oyun Motoru Programlama Seminerleri 5. Oturumu
Oturum Konusu: OpenGL
Toplam Uzunluk: 01:30:30

15 Kasım 2009 Pazar

BMP biçimindeki dosyaları okuma / C++ / OOP / openGL

BMP biçimindeki dosyalar, sıkıştırılmadan kullanılan ilkel resim dosyalarıdır. Basit bir kodlama yöntemi olduğundan rahatlıkla okunabilmektedir. Fakat herhangi bir sıkıştırma uygulanmadığı için disk üzerinde çok fazla yer kaplamaktadır. OpenGL ile grafik programlama yapanlar için kolaylık sağlayacağını düşündüğüm bir sınıf yazdım. 24-bit BMP dosyalarını okuyarak piksel bilgilerini hafızaya yükleyebilirsiniz. Önce sınıfa bir göz atalım:


// Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümü
// Ramazan Bellek 2009
// bmpImage Sınıfı Sürüm 1.0
// dosya: BmpLoader.h - 1.0
// http://rbellek.blogspot.com

#ifndef BmpLoader_h
#define BmpLoader_h

#include <windows.h> // Bitmap dosya formatı için gerekli başlık dosyası

class bmpImage
{
private:
int width; // resimin genişliği
int height; // resimin boyu
RGBTRIPLE *imageData; // her bir pikseli tutan 3'lü (kırmızı,mavi,yeşil)
LPCWSTR filename; // okuma yapılacak dosya adresi
HANDLE hfile; // dosyayı işaret eden başlık
DWORD read; // ne kadar veri okudğumuzu tutan değişken
BITMAPFILEHEADER bfh; // dosya başlığı
BITMAPINFOHEADER bih; // bilgileri tutan bölüm
int imagesize; // resmin boyutu (genişlik*boy)
bool status;
void bmpLoad();
void bmpUnload();
public:
bmpImage(LPCWSTR);
bmpImage();
~bmpImage();
void init();
void setFilename(LPCWSTR);
LPCWSTR getFilename();
RGBTRIPLE *getImageData();
int getWidth();
int getHeight();
int getImageSize();
bool getStatus();
void open();
void close();
};

RGBTRIPLE * BmpLoad(LPCWSTR );

#endif



// --------------------------


// Sakarya Üniversitesi Bilgisayar Mühendisliği Bölümü
// Ramazan Bellek 2009
// bmpImage Sınıfı Sürüm 1.0
// dosya: BmpLoader.cpp - 1.0
// http://rbellek.blogspot.com


#include "BmpLoader.h"

bmpImage::bmpImage()
{
init();
}

bmpImage::bmpImage(LPCWSTR filename)
{
this->filename=filename;
init();
open();
}

void bmpImage::init()
{
status=false;
width=0;
height=0;
imagesize=0;
}

void bmpImage::setFilename(LPCWSTR filename)
{
if (!status)
this->filename=filename;
}

LPCWSTR bmpImage::getFilename()
{
if (filename)
return filename;
}

RGBTRIPLE *bmpImage::getImageData()
{
if (status)
return imageData;
else return NULL;
}

int bmpImage::getWidth()
{
if (status)
return width;
else return 0;
}

int bmpImage::getHeight()
{
if (status)
return height;
else return 0;
}

int bmpImage::getImageSize()
{
if (status)
return imagesize;
else return 0;
}

bool bmpImage::getStatus()
{
return status;
}

void bmpImage::open()
{
if (!status)
{
status=true;
bmpLoad();
}
}

void bmpImage::close()
{
if (status)
{
status=false;
bmpUnload();
}
}



void bmpImage::bmpLoad()
{
if (status)
{
hfile = CreateFile(filename,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,NULL,NULL); // dosyamızı okumak üzere açıyoruz
ReadFile(hfile,&bfh,sizeof(bfh),&read,NULL); // başlık bilgilerini dosyadan okuyoruz.
ReadFile(hfile,&bih,sizeof(bih),&read,NULL);
width=bih.biWidth;
height=bih.biHeight;
imagesize = width*height; // resim için hafızada yer ayırmamıza yardımcı olmaktadır
imageData = new RGBTRIPLE[imagesize]; // resmin üzerinde değişiklik yapmak (istiyorsak) için yeni bir dizi oluşuturuyoruz
ReadFile(hfile,imageData,imagesize*sizeof(RGBTRIPLE),&read,NULL); // matrisi okuyalım (pixeller)
CloseHandle(hfile);
}
}

void bmpImage::bmpUnload()
{
imageData=NULL;
}


// ----------------------------------------------

openGL ile örnek kullanımı:

// programınıza #include "BmpLoader.h" eklemeyi unutmayınız.

glClearColor( 0.0f, 0.0f, 0.0f, 0.0f );
glClear(GL_COLOR_BUFFER_BIT);
bmpImage *resim=new bmpImage(L"c:\\kirpi.bmp");
resim->swap(); // RGB <-> BGR
RGBTRIPLE *imageData=resim->getImageData();
glBindTexture (GL_TEXTURE_2D, 1);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, resim->getWidth(), resim->getHeight(), 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);
glEnable (GL_TEXTURE_2D);
glBindTexture (GL_TEXTURE_2D, 1);
glBegin (GL_QUADS);
glTexCoord2f (0.0f,0.0f);
glVertex3f(-0.5f,-0.5f,0.0f);
glTexCoord2f (1.0f, 0.0f);
glVertex3f(0.5f,-0.5f,0.0f);
glTexCoord2f (1.0f, 1.0f);
glVertex3f(0.5f,0.5f,0.0f);
glTexCoord2f (0.0f, 1.0f);
glVertex3f(-0.5f,0.5f,0.0f);
glEnd ();
glDisable (GL_TEXTURE_2D);
resim->close();


Sonuc:



BMP dosya formatı için http://en.wikipedia.org/wiki/BMP_file_format adresine göz atabilirsiniz.

İyi Çalışmalar