2

OpenGL と C を使用して小さなタイリング ゲーム エンジンを作成しましたが、何が問題なのかわかりません。私のメインループは次のようになります。

void main_game_loop()
{
    (poll for events and respond to them)
    glClear(GL_COLOR_BUFFER_BIT);
    glPushMatrix();
    draw_block(WALL, 10, 10);
}

draw_block:

void draw_block(block b, int x, int y)
{
    (load b's texture from a hash and store it in GLuint tex)
    glPushMatrix();
    glTranslatef(x, y, 0);
    glBindTexture(GL_TEXTURE_2D, tex);

    glBegin(GL_QUADS);
    //BLOCK_DIM is 32, the width and height of the texture
    glTexCoord2i(0, 0); glVertex3f(0, 0, 0);
    glTexCoord2i(1, 0); glVertex3f(BLOCK_DIM, 0, 0);
    glTexCoord2i(1, 1); glVertex3f(BLOCK_DIM, BLOCK_DIM, 0);
    glTexCoord2i(0, 1); glVertex3f(0, BLOCK_DIM, 0);
    glEnd();
    glPopMatrix;
}

初期化関数: (main_game_loop の前に呼び出されます)

void init_gl()
{
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glClearColor(0, 0, 0, 0);

    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

実行すると、黒い画面が表示されます。ただし、glViewport 呼び出しを削除すると、テクスチャが表示されているように見えますが、巨大でウィンドウの隅に表示されます。スクリーンショット: スクリーンショット

テクスチャは正しく描画されています。大きな倍率でスケールアウトすると、画像全体が見えるからです。y 軸も、gluOrtho2D 呼び出しで使用したものとは反転しているようです (イベントで画像の x/y 座標を加算または減算し、y 座標から減算すると画像が下に移動することで発見されました)。これは私が考えることができる最も単純な例であるため、私はイライラし始めています。私は SDL を使用しており、SDL_OPENGL を SDL_SetVideoMode に渡しています。ここで何が起こっているのですか?

4

2 に答える 2

1

に問題があるように見えglViewportますが、念のため、カラー バッファをクリアして紫にしましたか?

glViewportウィンドウ マネージャーと OpenGL サブシステムの間の中間であり、ウィンドウ座標を使用するため、実際には OpenGL 自体の一部ではなく、ビデオ/ウィンドウ機能として常に考えてきました。そのため、他の SDL ビデオ コールと合わせて確認する必要があります。完全なコードで質問を更新するか、少なくともビデオ/ウィンドウサブシステムに関連する部分で更新することをお勧めします。

それともglViewport、サイズ変更後に呼び出すのを省略したのですか?

SDL_FULLSCREENまた、小さなウィンドウを使用せずに、または使用してコードを試す必要があります。ビューポートといくつかの基本的なコントロールが正しくなるまで、通常は 512x512 または 640x480 のウィンドウから始めます。

于 2012-11-13T18:01:37.877 に答える
0

glViewPort の最初の 2 つのパラメーターは、ビューの左下を指定します http://www.opengl.org/sdk/docs/man/xhtml/glViewport.xml

あなたが試すことができます

  glViewport(0, SCREEN_HEIGHT, SCREEN_WIDTH, SCREEN_HEIGHT);

gluOrtho2D の場合、パラメータは左、右、上、下なので、おそらく使用します

  gluOrtho2D(0, SCREEN_WIDTH, 0, SCREEN_HEIGHT);
于 2012-11-13T16:58:44.957 に答える