Bunun yerine 36 noktayı bi dizide tanımlayıp tek seferde de ekran kartına gönderebilirdim. Böylece ekran kartıyla daha az iletişime geçip tek seferte tüm bilgiyi gönderebilirdim.
Buyrun
Bunu sunucu-istemci gibi düşünün. Bir diziyi göndermek için bunun ne dizisi olduğunu söylemeniz lazım. Bu işi glEnableClientState ile yapıyoruz. parametrede ise ne tür veriler göndereceğimizi belirliyoruz. glVertexPointer ile noktalarımızın koordinatlarını gönderiyoruz.1. parametre kaç tane veriden oluştuğu. Biz 3 dedik çünkü x,y,z eğer 2 boyutlu kullansaydık x,y yani 2 kullanacaktık. 2. parametre verinin türü. Float kullandık. 3. parametre dizi nerden başlası. En baştan 0. son parametre dizimiz. glColorPointer, glVertexPointer ile aynı. Sadece renk dizisi için. glDrawArrays ise dizileri nasıl-neye göre basacağını söylememizi sağlar. 1. parametre üç noktadan üçgen yap GL_TRIANGLES. 2. parametre nerden başlayım 0 enbaş. 3. parametre ise kaç nokta var. 36* nokta boyutu/nokta boyutu. yani 36 tane. Eğer biz diziyi dosyadan çekseydik, dizi boyutunu alıp 3 e bölecektik çünkü 3 boyutlu. Böylece 36 adet glVertex3f yazmak yerine 7 adet komut yazmış olduk. Bu performans için oldukça gerekli.
Aslında bu bile hamallık. 36 nokta belirlemek yerine 8 nokta belirlesek sonra bunların indeksini alsak boyutu küçültürüz. Bi sonraki konumuz bu olsun. Görüşürüz.
Buyrun
PHP:
#include <GL/glut.h>
#include <stdlib.h>
static const GLfloat otuzAltiAdetNokta[] = {
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f,-1.0f,
1.0f,-1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f,-1.0f, 1.0f
};
static const GLfloat renkler[] = {
1,0,0,
1,0,0,
1,0,0,
1,0,1,
1,0,1,
1,0,1,
1,1,0,
1,1,0,
1,1,0,
0,1,0,
0,1,0,
0,1,0,
0,1,1,
0,1,1,
0,1,1,
1,0,0.5,
1,0,0.5,
1,0,0.5,
1,0.5,0,
1,0.5,0,
1,0.5,0,
1,0.5,0.5,
1,0.5,0.5,
1,0.5,0.5,
0.5,0,0,
0.5,0,0,
0.5,0,0,
0.5,0,1,
0.5,0,1,
0.5,0,1,
0.5,1,0,
0.5,1,0,
0.5,1,0,
0.5,0.5,0.5,
0.5,0.5,0.5,
0.5,0.5,0.5
};
static void
resize(int width, int height)
{
const float ar = (float) width / (float) height;
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity() ;
}
static void
display(void)
{
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
const double aci = t*90.0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glTranslatef(0,0,-5);
glRotatef(aci,1,0,1);//x ekseni ve z eksenlerinde döndürüyoruz
glScalef(0.5,0.5,0.5);
//36 glVertex3f yerine
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, otuzAltiAdetNokta);
glColorPointer(3, GL_FLOAT, 0, renkler);
glDrawArrays(GL_TRIANGLES, 0, 36*3 / 3);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glutSwapBuffers();
}
static void key(unsigned char key, int x, int y)
{
switch (key)
{
case 27 :
case 'q':
exit(0);
break;
}
glutPostRedisplay();
}
static void
idle(void)
{
glutPostRedisplay();
}
int
main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitWindowSize(640,480);
glutInitWindowPosition(10,10);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
glutCreateWindow("3B Kutu");
glutReshapeFunc(resize);
glutDisplayFunc(display);
glutKeyboardFunc(key);
glutIdleFunc(idle);
glClearColor(1,1,1,1);
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glutMainLoop();
return EXIT_SUCCESS;
}
Kod:
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, otuzAltiAdetNokta);
glColorPointer(3, GL_FLOAT, 0, renkler);
glDrawArrays(GL_TRIANGLES, 0, 36*3 / 3);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
Bunu sunucu-istemci gibi düşünün. Bir diziyi göndermek için bunun ne dizisi olduğunu söylemeniz lazım. Bu işi glEnableClientState ile yapıyoruz. parametrede ise ne tür veriler göndereceğimizi belirliyoruz. glVertexPointer ile noktalarımızın koordinatlarını gönderiyoruz.1. parametre kaç tane veriden oluştuğu. Biz 3 dedik çünkü x,y,z eğer 2 boyutlu kullansaydık x,y yani 2 kullanacaktık. 2. parametre verinin türü. Float kullandık. 3. parametre dizi nerden başlası. En baştan 0. son parametre dizimiz. glColorPointer, glVertexPointer ile aynı. Sadece renk dizisi için. glDrawArrays ise dizileri nasıl-neye göre basacağını söylememizi sağlar. 1. parametre üç noktadan üçgen yap GL_TRIANGLES. 2. parametre nerden başlayım 0 enbaş. 3. parametre ise kaç nokta var. 36* nokta boyutu/nokta boyutu. yani 36 tane. Eğer biz diziyi dosyadan çekseydik, dizi boyutunu alıp 3 e bölecektik çünkü 3 boyutlu. Böylece 36 adet glVertex3f yazmak yerine 7 adet komut yazmış olduk. Bu performans için oldukça gerekli.
Aslında bu bile hamallık. 36 nokta belirlemek yerine 8 nokta belirlesek sonra bunların indeksini alsak boyutu küçültürüz. Bi sonraki konumuz bu olsun. Görüşürüz.
Son düzenleme: