2011-02-15 115 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