2013-12-21 3 views
0

привет, я делаю простую игру, используя openGl только ..... я сделал главное меню, установил фон для него и некоторые параметры, как когда-либо, когда я рисую меню, фоновое изображение становится зеленоватым цвет, кстати, последняя строка в меню i окрашивает ее в зеленый цвет, а когда я окрашиваю ее в синий цвет, например, фоновое изображение превращается в ту же самую цветную PLZ-справку, что и функция MainMenuDispaly.background issue in openGl

здесь ПИК

вот что я делаю:

каждую вещь была сделана правильно, кроме этого :(

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 i s конечный автомат. То есть он сохраняет состояние того, что он делает, и применяет его к остальной части. Вы рисуете текстурированный квадратик, но это также включает все другое состояние, которое вы определили. В том числе цвет вы настроили нарисовать свои записи меню (которые вы не должны рисовать с использованием glutBitmapString в долгосрочной перспективе).

Итак, вы должны принести OpenGL в состояние, подходящее для рисования текстурированного квадрата. Теперь вам действительно нужно использовать шейдеры и вершинные массивы (в VBOs), потому что в современном 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: Вы можете просто вызвать glColor вне блока glBegin/glEnd. Я сделал это намеренно в фрагменте кода, чтобы продемонстрировать конечный автомат OpenGL. – datenwolf