2011-02-15 55 views
5

我有一个让太阳系动画的程序。该计划吸引了太阳和几颗轨道行星。我喜欢在背景中放置一个星云像素图,但我不知道该如何去做。我所尝试过的似乎并不奏效。这是我尝试过的。如何在openGL中绘制背景

1)使用glDrawPixels绘制像素图。通过这种方法,我能够绘制像素图,但它覆盖了太阳物体。我试图翻译像素图,但也没有工作。

2)绘制GL_QUADS作为太阳物体后面的平面。这架飞机是一个微小的平行四边形。

对于我所知道的这可能是完全错误的方法。 如果有人能指引我走向正确的方向,我将不胜感激。以下是方法#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

那么,什么是你尝试号码2的问题? – kvark 2011-02-15 18:23:59

回答

3

绘制全屏四:

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

调用这些第一,然后整个场景。 和使用着色器程序是这样的:

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

也提防,因为gl_Vertex已正式弃用。 如果你必须使用固定的管道,即是这样的:

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

只要确保添加一个调用glOrtho: – 2011-02-15 16:33:14