2011-02-15 22 views
5

Mam program do animowania układu słonecznego. Program rysuje słońce i kilka orbitujących planet. Lubię umieszczać w tle mapę mgławicy, ale nie wiem, jak to zrobić. To, co próbowałem, nie działa. Oto, co próbowałem.Jak narysować tło w openGL

1) Użyj programu glDrawPixels, aby narysować pixmapę. Dzięki takiemu podejściu udało mi się narysować pixmapę, ale pokryła ona obiekty słoneczne. Próbowałem przetłumaczyć pixmapę, ale to też nie zadziałało.

2) Narysuj GL_QUADS jako płaszczyznę za obiektami słonecznymi. Samolot był jak maleńki równoległobok.

Z tego, co wiem, może to być całkowicie błędne podejście. Byłbym wdzięczny, gdyby ktoś wskazał mi właściwy kierunek. Oto kod dla metody # 1.

  
void 
universe::createObj() 
{ 
    QPixmap map ("hst_orion_nebula.jpg"); 

    glTexImage2D (GL_TEXTURE_2D,0, GL_LUMINANCE, map.width(), map.height(), 0, 
        GL_BGRA,GL_UNSIGNED_BYTE, map.convertToImage().bits()); 

    callId = glGenLists(itemId::next()); 

    glNewList(callId, GL_COMPILE); 

     glDrawPixels (map.width(), map.height(), GL_RGBA, 
     GL_UNSIGNED_BYTE, map.convertToImage().bits()); 

    glEnable (GL_TEXTURE_2D); 
    glEndList(); 
} 

void 
universe::draw() 
{ 
    glPushMatrix(); 
    glPushAttrib (GL_COLOR_BUFFER_BIT | GL_LIGHTING_BIT); 

    glCallList (callId); 

    glPopMatrix(); 
    glPopAttrib(); 
} 

///////////////////////////////// 
void 
sun::createObj() 
{ 
    QPixmap map ("sunmap.jpg"); 

    glGenTextures (10, canvas::_instance->_texture); 
    glBindTexture(GL_TEXTURE_2D, canvas::_instance->_texture[0]); 

    glTexImage2D(GL_TEXTURE_2D,0, GL_LUMINANCE, map.width(), map.height(), 0, 
        GL_BGRA,GL_UNSIGNED_BYTE, map.convertToImage().bits()); 

    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); 

    callId = glGenLists(itemId::next()); 

    glNewList(callId, GL_COMPILE); 

    GLUquadricObj *sphere_quadric = gluNewQuadric(); 
    gluQuadricTexture(sphere_quadric, GL_TRUE); 
    gluQuadricDrawStyle(sphere_quadric, (GLenum)GLU_SMOOTH); 
    gluSphere(sphere_quadric, 25, 36, 36); 

    glEnable (GL_TEXTURE_2D); 
    glEndList(); 
} 

void 
sun::draw() 
{ 
    glEnable(GL_LIGHTING); 

    glPushMatrix(); 

    glPushAttrib (GL_COLOR_BUFFER_BIT | GL_LIGHTING_BIT); 

    GLfloat color1[4] = {1, 0.50, .0, 1 }; 

    glRotated (_xangle, 1, 0, 0); 
    glRotated (_yangle, 0, 1, 0); 
    glRotated (_zangle, 0, 0, 1); 

    glBindTexture(GL_TEXTURE_2D, canvas::_instance->_texture[0]); 
    GLfloat shine[1] = {128}; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, color1); 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, shine); 
    glCallList (callId); 
    glPopMatrix(); 
    glPopAttrib(); 
} 



+0

Więc jaki jest problem z twoją próbą numer 2? – kvark

Odpowiedz

3

narysować pełnoekranowy Quad:

glBegin(GL_QUADS); 
    glVertex2f(1,1); 
    glVertex2f(1,0); 
    glVertex2f(0,0); 
    glVertex2f(0,1); 
glEnd(); 

połączenia tych pierwszych, a następnie cała scenę. i wykorzystanie programu shader tak:

void main(void){ 
    gl_Position = gl_Vertex * 2.0 - 1.0; 
    gl_TexCoord[0] = gl_Vertex; 
    } 

także uważaj, bo gl_Vertex oficjalnie przestarzała. Jeśli musisz użyć stałego rurociągu, to jest sposób:

glMatrixMode(GL_PROJECTION); 
glPushMatrix(); 
glLoadIdentity(); 
glMatrixMode(GL_MODELVIEW); 
glPushMatrix(); 
glLoadIdentity(); 

glBegin(GL_QUADS); 

    glTexCoord2f(0,0); 
    glVertex2f(-1.0f, -1.0f); 
    glTexCoord2f(1,0); 
    glVertex2f(1.0f, -1.0f); 
    glTexCoord2f(1,1); 
    glVertex2f(1.0f, 1.0f); 
    glTexCoord2f(0,1); 
    glVertex2f(-1.0f, 1.0f); 

glEnd(); 

glPopMatrix(); 
glMatrixMode(GL_PROJECTION); 
glPopMatrix(); 
glMatrixMode(GL_MODELVIEW); 
+0

Tylko pamiętaj, aby dodać wywołanie funkcji glOrtho: –

+0

, dlaczego nie wystarczy wywołać glTexCoord2f lub cokolwiek i nie używać do tego modułu cieniującego? – Flexo

+2

Ten kod działa poprawnie bez glOrtho; p –