openGL,当我加载纹理时文本会发生变化

openGL, text changes when I load textures

我正在开发 C++ 应用程序,我需要使用在 openGL 中制作的界面。我有一个灰色的背景,背景上有一些方形纹理,还有一些文字写在纹理旁边。文本是黄色的,但是当我用鼠标单击 window 或更改纹理时,文本变成灰色(与背景不同的灰色),我不知道为什么!这是代码和屏幕截图:

int main(int argc, char** argv){
    [...]
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL);  
    glShadeModel(GL_FLAT);   
    glEnable(GL_BLEND);
    glEnable(GL_POINT_SMOOTH);

    // Render the scene
    glutDisplayFunc(display);   
    glutReshapeFunc(reshape);   

    // Turn the flow of control over to GLUT 
    glutMainLoop();

    [...]
}

void display(void){
    glClearColor(0.2f, 0.2f, 0.2f, 0.5f); //Background color
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    // Set up viewing transformation, looking down -Z axis
    glLoadIdentity();
    gluLookAt(posx, 0, -g_fViewDistance, 0, 0, -1, 0, 1, 0); 

    // Render the scene
    glMatrixMode(GL_COLOR);
    glColor3f(1.0f, 1.0f, 0.0f); // Textcolor

    drawOnScreen(); // Draw text on screen
    glMatrixMode(GL_MODELVIEW);

    loadSquare(); // Load texture
    glutSwapBuffers();
}

void reshape(GLint width, GLint height){
    interface->setWindowWidth(width);
    interface->setWindowHeight(height);
    glViewport(0, 0, g_Width, g_Height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(65.0, (float)g_Width / g_Height, g_nearPlane, g_farPlane);
    glMatrixMode(GL_MODELVIEW);
}

void printStringOnVideo(void* font, char* s){
    if (s && strlen(s)) {
        while (*s) {
            glutBitmapCharacter(font, *s);
            s++;
        }
    }
}

void drawOnScreen(){
    GLfloat x, y;
    // Draw the strings, according to the current mode and font. 
    x = 2.90f;
    y = 0.80f;
    glRasterPos2f(x, y);
    int len;
    char s[] = { 'H', 'E', 'L', 'L', 'O', '[=10=]' };
    len = (int)strlen(s);
    printStringOnVideo(GLUT_BITMAP_TIMES_ROMAN_24, s);
}

loadSquare() 函数将纹理应用于正方形。它的主要特点是调用 class 方法在正方形上加载纹理:

void P300Square::setTexture(bool func){
// Se func = 0 allora carico la texture, viceversa il flash

string tmp = "";

if (func == false)
    tmp = texturePath;
else
    tmp = textureFlashPath;

GLuint texture = SOIL_load_OGL_texture
    (
    tmp.c_str(),
    SOIL_LOAD_AUTO,
    SOIL_CREATE_NEW_ID,
    SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
    );
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glColor3ub(50, 50, 50);


glEnable(GL_BLEND);
glBegin(GL_QUADS);
glColor4f(0.5f, 0.0, 0.0f, 0.8f);
// Top Left
glTexCoord2f(0, 1);
glVertex2f(u, v);
// Top Right
glTexCoord2f(1, 1);
glVertex2f(u + size, v);
// Bottom Right
glTexCoord2f(1, 0);
glVertex2f(u + size, v + size);
// Bottom Left
glTexCoord2f(0, 0);
glVertex2f(u, v + size);

glEnd();
glDisable(GL_BLEND);
}

有人可以帮助我吗?谢谢!

您应该在绘制位图字体之前禁用 GL_TEXTURE_2D

在内部,glutBitmapCharacter() 使用 glBitmap。此函数将位图映射到屏幕上的矩形,并为该矩形中位图为 1 的每个帧缓冲区像素生成片段。这些片段从与当前光栅位置关联的值中获取关联数据。

生成的片段像其他片段一样处理(即通过绘制线或三角形等图元生成的片段)。因此,纹理、光照、雾、混合等内容也会影响 glBitmap 绘制的所有内容。由于单个位图生成的所有片段都获得相同的关联数据,因此它们都将获得相同的纹理坐标。由于您打开了纹理,GL 使用来自纹理的完全相同的样本对所有这些片段进行纹理处理,因此它们都以相同的颜色出现。