2010-06-17 2 views
3

Я использую библиотеку theallegro и через нее OpenGL. Включить проверку глубины, то при изменении размера я:Полигоны OpenGL застряли в левом верхнем углу?

glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 
    glEnable(GL_DEPTH_TEST); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glFrustum(0,event.display.width,event.display.height,0,1,300); 

Тогда мой рисунок выглядит так:

float BOX_SIZE = 200.0f; 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


     glRotatef(0.5, 0, 0.0f, 1.0f); 
     glBegin(GL_QUADS); 

     //Top face 
     glColor3f(1.0f, 1.0f, 0.0f); 
     glNormal3f(0.0, 1.0f, 0.0f); 
     glVertex3f(500 + -BOX_SIZE/2, BOX_SIZE/2, -BOX_SIZE/2); 
     glVertex3f(500 + -BOX_SIZE/2, BOX_SIZE/2, BOX_SIZE/2); 
     glVertex3f(500 + BOX_SIZE/2, BOX_SIZE/2, BOX_SIZE/2); 
     glVertex3f(500 + BOX_SIZE/2, BOX_SIZE/2, -BOX_SIZE/2); 

     //Bottom face 
     glColor3f(1.0f, 0.0f, 1.0f); 
     glNormal3f(0.0, -1.0f, 0.0f); 
     glVertex3f(-BOX_SIZE/2, -BOX_SIZE/2, -BOX_SIZE/2); 
     glVertex3f(BOX_SIZE/2, -BOX_SIZE/2, -BOX_SIZE/2); 
     glVertex3f(BOX_SIZE/2, -BOX_SIZE/2, BOX_SIZE/2); 
     glVertex3f(-BOX_SIZE/2, -BOX_SIZE/2, BOX_SIZE/2); 

     //Left face 
     glNormal3f(-1.0, 0.0f, 0.0f); 
     glColor3f(0.0f, 1.0f, 1.0f); 
     glVertex3f(-BOX_SIZE/2, -BOX_SIZE/2, -BOX_SIZE/2); 
     glVertex3f(-BOX_SIZE/2, -BOX_SIZE/2, BOX_SIZE/2); 
     glColor3f(0.0f, 0.0f, 1.0f); 
     glVertex3f(-BOX_SIZE/2, BOX_SIZE/2, BOX_SIZE/2); 
     glVertex3f(-BOX_SIZE/2, BOX_SIZE/2, -BOX_SIZE/2); 

     //Right face 
     glNormal3f(1.0, 0.0f, 0.0f); 
     glColor3f(1.0f, 0.0f, 0.0f); 
     glVertex3f(BOX_SIZE/2, -BOX_SIZE/2, -BOX_SIZE/2); 
     glVertex3f(BOX_SIZE/2, BOX_SIZE/2, -BOX_SIZE/2); 
     glColor3f(0.0f, 1.0f, 0.0f); 
     glVertex3f(BOX_SIZE/2, BOX_SIZE/2, BOX_SIZE/2); 
     glVertex3f(BOX_SIZE/2, -BOX_SIZE/2, BOX_SIZE/2); 

     glEnd(); 

     glEnable(GL_TEXTURE_2D); 

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
     glColor3f(1.0f, 1.0f, 1.0f); 
     glBegin(GL_QUADS); 

     //Front face 
     glNormal3f(0.0, 0.0f, 1.0f); 
     glTexCoord2f(0.0f, 0.0f); 
     glVertex3f(-BOX_SIZE/2, -BOX_SIZE/2, BOX_SIZE/2); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex3f(BOX_SIZE/2, -BOX_SIZE/2, BOX_SIZE/2); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex3f(BOX_SIZE/2, BOX_SIZE/2, BOX_SIZE/2); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex3f(-BOX_SIZE/2, BOX_SIZE/2, BOX_SIZE/2); 

     //Back face 
     glNormal3f(0.0, 0.0f, -1.0f); 
     glTexCoord2f(0.0f, 0.0f); 
     glVertex3f(-BOX_SIZE/2, -BOX_SIZE/2, -BOX_SIZE/2); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex3f(-BOX_SIZE/2, BOX_SIZE/2, -BOX_SIZE/2); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex3f(BOX_SIZE/2, BOX_SIZE/2, -BOX_SIZE/2); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex3f(BOX_SIZE/2, -BOX_SIZE/2, -BOX_SIZE/2); 

     glEnd(); 
     glDisable(GL_TEXTURE_2D); 
//code goes here 
al_flip_display(); 

по какой-то причине куба, независимо от того, как я перевести его, кажется, простирается от 0,0 и всегда есть вершина в 0,0. Что я сделал не так? Спасибо

ответ

2

Я не знаю никаких особенностей библиотеки allegro, но при чтении фрагмента кода вам приходят в голову две вещи.

  1. Почему вы не звоните glViewport(event.display.width,event.display.height) При изменении размера? Звонок glFrustum обычно не должен зависеть от размера дисплея .

  2. Вы когда-нибудь звонили glMatrixMode(GL_MODELVIEW)? В противном случае все матричные операции будут применены к матрице проекции .

Надеюсь, что это поможет.

Смежные вопросы