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 Compatibilty Profile Context、3.3 GLSL、および 2.0 SFML (ソースからコンパイル) を使用しています。

4

1 に答える 1

0

SFML のレンダリング バグを修正する方法が見つからなかったため、フォント レンダリングをftglに切り替えました。

SFML と OpenGL の状態の競合が非常に広まっているように見えるため、元に戻すとは思えません。

StackOverflow: SFML OpenGL 描画テキスト

SFML フォーラム: OpenGL ライティングと RenderWindow を使用したクレイジーなバグ

SFML フォーラム: glCullFace は SFML を盲目にする

于 2012-11-18T13:33:40.967 に答える