2011-02-15 32 views
5

Tengo un programa para animar el sistema solar. El programa dibuja el sol y algunos planetas en órbita. Me gusta poner un mapa de puntos de la nebulosa en el fondo, pero no sé cómo hacerlo. Lo que he intentado no parece funcionar. Esto es lo que he intentado.Cómo dibujar fondo en openGL

1) Use glDrawPixels para dibujar pixmap. Con este enfoque, pude dibujar el mapa de píxeles, pero cubría los objetos solares. Traté de traducir el mapa de puntos pero tampoco funcionó.

2) Dibuje un GL_QUADS como plano detrás de los objetos solares. El avión estaba arriba como un pequeño paralelogramo.

Por lo que sé, este podría ser un enfoque totalmente equivocado. Agradecería que alguien me señale la dirección correcta. Aquí está el código para el método # 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

Entonces, ¿cuál es el problema con el número de su intento 2? – kvark

Respuesta

3

para dibujar un quad pantalla completa:

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

llamar a los primero, y luego toda la escena. y el uso del programa de sombreado de la siguiente manera:

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

También tenga cuidado, porque está en desuso gl_Vertex oficialmente. Si usted tiene que utilizar la tubería fija, que es la forma:

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

Solo asegúrese de agregar una llamada a glOrtho: –

+0

¿por qué no simplemente llama a glTexCoord2f o lo que sea y evita usar un sombreador para esto? – Flexo

+2

Este código se ejecuta correctamente sin glOrtho; p –

Cuestiones relacionadas