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