|
请教各位一个问题:
使用下面的代码输出文本,发现如果不禁用纹理输出的文本始终是黑色的,而禁用以后则正常。多重纹理的情况下则必须将每层纹理都禁用才行,否则始终是黑色。
参考了一下《学OpenGL编3D游戏》CAI教程里的代码,发现在输出文本时同样禁用了纹理。问题是它是个单层纹理的程序,直接disable一下就可以了。多重纹理的情况下禁用所有纹理需要知道纹理层数吧?
一个输出文本的子函数需要知道当前程序使用的纹理层数?感觉有点麻烦。请问有更好的解决办法吗?谢谢。
GLuint list = glGenLists(static_cast<GLsizei>(str.length()) + 1);
Activate(); // active font
for (uint_t i=0; i<str.length(); ++i)
wglUseFontBitmaps(wglGetCurrentDC(), str, 1, list + i + 1);
glNewList(list, GL_COMPILE);
{
for (uint_t i=1; i<=str.length(); ++i)
glCallList(list + i);
}glEndList();
//////////////////////////////////////////////////////////
// disable texture
glActiveTexture(GL_TEXTURE0);
glDisable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE1);
glDisable(GL_TEXTURE_2D);
//////////////////////////////////////////////////////////
glDisable(GL_DEPTH_TEST);
glColor3f(color.r_, color.g_, color.b_); // text color
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
uint_t w, h;
GetTextSize(str.c_str(), w, h);
glRasterPos2i(x + 1, y + h);
glCallList(list);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glEnable(GL_DEPTH_TEST);
//////////////////////////////////////////////////////////
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
//////////////////////////////////////////////////////////
glDeleteLists(list, static_cast<GLsizei>(str.length()) + 1); |
|