OpenGL阻止颜色影响其他几何体



我在使用glColor着色的3D视口中有文本,然后我还将几何体存储在VBO中,该VBO在渲染文本之前进行渲染。出于某种原因,文本颜色实际上会影响VBO的颜色。我现在并没有给我的VBO上色,所以这可能是问题的一部分。但我试图在文本渲染中使用glPushAttrib来在调用文本渲染之前保留颜色,但它不起作用。代码:

public static void renderString(Font font, String string, int gridSize, float x, float y, float charWidth, float charHeight, float scale, Color4f color) {
    glPushAttrib(GL_TEXTURE_BIT | GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT);
    glEnable(GL_CULL_FACE);
    glEnable(GL_TEXTURE_2D);
    font.bind();
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_ONE);
    glColor4f(color.r, color.g, color.b, color.a);
    glPushMatrix();
    glScalef(scale, scale, 0f);
    glTranslatef(x, y, 0);
    glBegin(GL_QUADS);
    for(int i = 0; i < string.length(); i++){
        int code = (int) string.charAt(i);
        float cellSize = 1.0f / gridSize;
        float cellX = ((int) code % gridSize) * cellSize;
        float cellY = ((int) code / gridSize) * cellSize;
        glTexCoord2f(cellX, cellY + cellSize);
        glVertex2f(i * charWidth / 3, y);
        glTexCoord2f(cellX + cellSize, cellY + cellSize);
        glVertex2f(i * charWidth / 3 + charWidth / 2, y);
        glTexCoord2f(cellX + cellSize, cellY);
        glVertex2f(i * charWidth / 3 + charWidth / 2, y + charHeight);
        glTexCoord2f(cellX, cellY);
        glVertex2f(i * charWidth / 3, y + charHeight);
    }
    glEnd();
    glPopMatrix();
    glPopAttrib();
}

它被称为:

public void render() {
    render3D();
    camera.applyTranslations();
    world.render();
    glLoadIdentity();
    if (renderText) {
        render2D();
        renderText();
    }
}

World.render保存了我的VBO,正如你所看到的,它是在调用文本之后调用的。那么这怎么可能呢?如何重置颜色,使其不影响其他几何体?

您似乎想知道为什么glPushAttrib/glPopAttrib的使用没有达到将OpenGL状态机恢复到更改前的状态的预期效果。

让我们暂时注意一下,attrib堆栈已经被弃用,并且在现代OpenGL中不再受支持,但您无论如何都没有使用现代功能集。

快速浏览一下glPushAttrib的文档,就会发现GL_COLOR_BUFFER_BIT不会使OpenGL存储颜色属性状态。这是由GL_CURRENT_BIT标志完成的,它会影响整个顶点属性状态。

OpenGL是一个状态机——没有"特定于对象"的颜色。一旦你设置了颜色,它就会一直保持这种状态,直到你明确地更改它。通常,如果你想用某种颜色绘制某个对象,你必须在绘图调用该对象之前(或期间)设置该颜色。

最新更新