0

我想在我的 OpenGL 应用程序中显示一些文本,并且已经在使用 SFML 来创建窗口和上下文。我不想添加另一个库并尝试使用 SFML (2.0) 提供的文本呈现。

呈现的文本由白色矩形组成(矩形与它们应该大致显示的字符的高度相匹配)。

在我添加了一些方法以保持 OpenGL 状态与使用 SFML 文本之前的状态相同之后,其他所有内容都正确呈现。如果没有这些方法,则不会渲染任何内容,但会使用正确的颜色缓冲区清除颜色。

我使用 GLSL 进行纹理和照明(如果需要,可以提供源和屏幕截图)。

我使用的代码:

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();

//rotations for looking around & moving the camera
glRotatef(camera.rotation[0], 1.0f, 0.0f, 0.0f);
glRotatef(camera.rotation[1], 0.0f, 1.0f, 0.0f);
glRotatef(camera.rotation[2], 0.0f, 0.0f, 1.0f);
glTranslatef( -5.0f+camera.translation[0], 
                    camera.translation[1], -7.5f+camera.translation[2]);

//set OpenGL light attributes
passPosition(GL_LIGHT0, spotLight);
passSpotDirection(GL_LIGHT0, spotLight);
passPosition(GL_LIGHT1, greenLight);
passPosition(GL_LIGHT2, redLight);
passPosition(GL_LIGHT3, blueLight);

glUseProgram( shaderProg.getId() );
renderMap();
glUseProgram(0);

window.pushGLStates();//supposed to prevent OpenGL & SFML conflicts 
window.draw(testText);
window.popGLStates();

err = glGetError();//doesn't report any errors
if(err != GL_NO_ERROR)
{
    std::cout << "ERROR: " << err << std::endl;
}

window.display();

文本实例是这样创建的:

sf::Font fontVera;

std::cout << fontVera.loadFromFile("./res/Vera.ttf") << std::endl;
//the font is existing, output for debugging purposes(and shows no error)

sf::Text testText("hasdfas", fontVera, 32);
testText.setPosition(10,10);

我正在使用 3.3 兼容性配置文件上下文、3.3 GLSL 和 2.0 SFML(从源代码编译)。

4

1 回答 1

0

我已将字体渲染切换为ftgl,因为我没有找到任何方法来修复 SFML 的渲染错误。

我怀疑我会切换回来,因为 SFML-OpenGL 状态冲突似乎相当普遍:

StackOverflow:SFML OpenGL 绘图文本

SFML-Forums:使用 OpenGL 照明和 RenderWindow 的疯狂错误

SFML 论坛:glCullFace 使 SFML 失明

于 2012-11-18T13:33:40.967 回答