2013-12-21 108 views
0

您好我正在製作一個簡單的遊戲,只使用openGl .....我做了一個主菜單,爲它設置了一個背景和一些選項,當我繪製菜單時背景圖片變成綠色顏色,順便說一句,在菜單中的最後一個字符串,我把它變成綠色,當我把它變成藍色時,例如背景圖像變成了相同的顏色,但是我只能用MainMenuDispaly函數。openGl中的背景問題

這裏是PIC

這裏是我做的:

每一件事情是正確的,除了做這個:(

void MainMenuDis() 
{ 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glBindTexture(GL_TEXTURE_2D,texture); 
    glEnable (GL_TEXTURE_2D); 
    glBegin(GL_QUADS); 
    glTexCoord2f(0,1); 
    glVertex3f(-5,5,-6); 
    glTexCoord2f(0,0); 
    glVertex3f(-5,-5,-6); 
    glTexCoord2f(1,0); 
    glVertex3f(5,-5,-6); 
    glTexCoord2f(1,1); 
    glVertex3f(5,5,-6); 
    glEnd(); 

    glDisable(GL_TEXTURE_2D); 

    for(int i = 0 ; i < 5 ; ++i) 
    { 
    MainMenuList[i].DrawString(GLUT_BITMAP_9_BY_15); 
    } 

    Navigate.DrawString(GLUT_BITMAP_HELVETICA_12); 

    glutSwapBuffers(); 
    glFlush(); 
} 
+0

你做錯了。立即模式已棄用。 –

+0

@Sarge Borsch可以請你告訴我什麼是正確的做法或任何有用的教程.... –

+0

你可以看看例如[學習現代3D圖形編程](http://www.arcsynthesis.org/gltut/)或[opengl-tutorial.org](http://www.opengl-tutorial.org/)。使用着色器看起來似乎在第一眼看起來更復雜,因爲在看到第一個結果並進入它之前需要更長的時間,但您應該花時間學習它,而不是使用不贊成的即時模式。 –

回答

1

你的問題是,你忘了那個OpenGL我是一臺狀態機。即它保持它的最後狀態並將其應用於其餘部分。你正在畫一個有紋理的四邊形,但是它也包含了你定義的所有其他狀態。包括顏色你已經設置繪製你的菜單條目(你不應該使用長期的glutBitmapString繪製)。

因此,您必須將OpenGL帶入適合繪製紋理四邊形的狀態。現在你應該真的使用着色器和頂點數組(在VBO中),因爲在現代OpenGL中,所有的繪圖細節都是由使用的着色器控制的,該着色器使用單行切換。

`glUseProgram(…);` 

然而,在你的情況下,使用固定功能管線即時模式下你已經設置了一些事情:

glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glDisable(GL_DEPTH_TEST); 
    glDisable(GL_LIGHTING); 
    glColor3f(1.,1.,1.); 
    /* and probably a few more depending on what you're setting elsewhere */ 

    glBindTexture(GL_TEXTURE_2D,texture); 
    glEnable (GL_TEXTURE_2D); 
    glBegin(GL_QUADS); 
     … 
+0

耶剛剛加入glColoef(1,1,1);在glBegin(GL_QUADS)之後。謝謝:) –

+0

@SaifSuleiman:你可以很好地調用glBegin/glEnd塊之外的glColor。我在代碼片段中故意做了這個例子來舉例說明OpenGL的狀態機。 – datenwolf