C++ / OpenGL [ 12 – Fonts ]

Fonts ve FPS

opengl de ekrana yazi yazdirabilmemiz icin glutun kendi fonksiyonu mevcut

glutBitmapCharacter(void *font, int character); 
ornekle gosterirsek
glutBitmapCharacter(GLUT_BITMAP_8_BY_13, ‘H’);

bu basit bir yazi dokme fonksiyonu bu yuzden kendimize yaziyi siralayabilen
pozisyonunu secebilecegimiz bir fonksiyon olusturacagiz.

bunun icin once font degiskenimizi atiyoruz

[c language=”++”]

GLvoid *font_style = GLUT_BITMAP_HELVETICA_18;

[/c]

secebilecegimiz diger font sekillerimiz;

GLUT_BITMAP_8_BY_13
GLUT_BITMAP_9_BY_15
GLUT_BITMAP_TIMES_ROMAN_10
GLUT_BITMAP_TIMES_ROMAN_24
GLUT_BITMAP_HELVETICA_10
GLUT_BITMAP_HELVETICA_12
GLUT_BITMAP_HELVETICA_18

fonksiyonumuzu olusturalim;

[c language=”++”]
void printw (float x, float y, float z, char* format, …)
{
va_list args; // konu listemiz
int len; // yazi uzunlugu
int i; // yineleyici
char * text; // ve yazimiz

va_start(args, format);
len = _vscprintf(format, args) + 1;
text = (char*) malloc(len * sizeof(char));
vsprintf_s(text, len, format, args);
va_end(args);
glRasterPos3f (x, y, z);

for (i = 0; text[i] != ‘\0’; i++)
glutBitmapCharacter(font_style, text[i]);

free(text);
}
[/c]

glRasterPos3f(x,y,z); //bu method ile yazimizin pozisyonunu fonksiyona gomduk
ve for dongusu sayesinde
karakterlerimizi siralayarak String e donusturuyoruz

free(text); // Ayrılan bellek alanı geri bırakılıyor

buradan sonra tek yapmamiz gereken printw(); fonksiyonumuzu displayimizin icinde kullanmak;

[c language=”++”]
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0,0.0,0.0);
glColor3f(1.0,0.0,0.0);
printw(0, 0, 0, "Erimicel.com");

glutSwapBuffers();
}
[/c]

yazimizin rengini
glColor3f(1.0,0.0,0.0); // kirmizi yaptik
ve yazimizi yaziyoruz.
printw(0, 0, 0, “Erimicel.com”);
// x,y,z pozisyonlari ve ,”yazi”

FPS Ekrana yazalim

FPS (saniyelik goruntu sayisi)

ekrana yazi yazma fonksiyonumuzu olusturdugumuza gore simdi ekrana FPS imizi yazabiliriz.
oncelikle fps degiskenlerimizi ekliyoruz.

[c language=”++”]
int frameCount = 0;
float fps = 0;
int currentTime = 0, previousTime = 0;
[/c]

FPS olcen fonksiyonumuzu olusturuyoruz.

[c language=”++”]
void calculateFPS()
{
frameCount++;

// saniyeleri hesapla
currentTime = glutGet(GLUT_ELAPSED_TIME);

// gecen zamani hesapla
int timeInterval = currentTime – previousTime;

if(timeInterval > 1000)
{
// saniyelik goruntu hesapla
fps = frameCount / (timeInterval / 1000.0f);

// zamani ayarla
previousTime = currentTime;

// sayaci sifirla
frameCount = 0;
}
}
[/c]

ekrana fps yazdirirken FPS in hesaplanmasi icin
her saniye goruntuyu yenilememiz gerekmekte bu yuzden
idle fonksiyonu olusturuyoruz.

[c language=”++”]
void idle (void)
{
// fps olc
calculateFPS();
// fps her saniye olcmek icin goruntuyu yenile
glutPostRedisplay ();
}
[/c]

onceden olusturdugumuz yazilarin bulundugu displayimize
fpsi yazacak methodu ekliyoruz

[c language=”++”]
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glTranslatef(0.0,0.0,0.0);
glColor3f(1.0,0.0,0.0);
printw(0, 0, 0, "Erimicel.com");
printw(0, -0.2, 0, "Erym Sources");
font_style = GLUT_BITMAP_9_BY_15;
glColor3f(0.0f,1.0f,1.0f);
printw(-1.2, 1.0, 0, "FPS : %4.2f",fps);
glutSwapBuffers();
}
[/c]

font_style degiskenimize istersek font umuzu degistirebiliyoruz.
printw(-1.2, 1.0, 0, “FPS : %4.2f”,fps);
ile ise fps imizi ekrana yazdiriyoruz.

en son ana fonksiyonumuza glutIdleFunc (idle); //cagrisini ekliyoruz

[c language=”++”]
.
..
glutIdleFunc (idle);
..
.
[/c]

Projemizin goruntusu;

ders12_fps

Ders sonunda olusturdugumuz projenin .cpp kaynak dosyasini buradan indirebilirsiniz.

ders12_font

 

Leave a Reply

Your email address will not be published. Required fields are marked *