2

SDLとopenGLの使い方を学んでいます。私は SDLTutorials.com でチュートリアルを完了しました。私は今、物事をさらに進めて、アプリケーションのロード画面を作成しようとしています。おっとメニューシステム。

私は物事をテストするために本当に簡単に始めています。テクスチャ クラスを介してウィンドウのメインの背景を作成しました。関連する 2 つの関数をここで定義します。

void Texture::Bind() {
   glBindTexture(GL_TEXTURE_2D, TextureID);
}

void Texture::RenderQuad(int X, int Y, int Width, int Height) {
Bind();

    glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(X, Y, 0);
        glTexCoord2f(1, 0); glVertex3f(X + Width, Y, 0);
        glTexCoord2f(1, 1); glVertex3f(X + Width, Y + Height, 0);
        glTexCoord2f(0, 1); glVertex3f(X, Y + Height, 0);
    glEnd();
}

また、基本的にシステムで作成されたメニューの親となるメニュークラスも作成しました。開発されるクラスは、クリックボタンまたは編集ボックスのようなものです。これまでのところ、Menu クラスの唯一の関連関数は次のとおりです。

void Menu::OnRender() {
    if( Visible ) {
        if(MenuTexture == NULL) {
            glColor4f(1.,G,B,A);
            glBegin(GL_QUADS);
                glVertex2d(X, Y);
                glVertex2d(X+Width,Y);
                glVertex2d(X+Width,Y+Height);
                glVertex2d(X,Y+Height);
            glEnd();
        }else{
            MenuTexture->RenderQuad(X,Y,Width,Height);
        }
    }
}

最後に、私のアプリケーションは、ウィンドウ全体にバインドする 1 つのテクスチャを作成しました。つまり、背景。

void App::OnRender() {


    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();


    MainScreen.RenderQuad(0,0,winWidth,winHeight); //Texture Object with bkg.jpg
    MainMenu.OnRender();  //Menu object to be 150x300 and all black


    SDL_GL_SwapBuffers();
}

次に、メニュー項目を作成し、背景の上に描画してみます。初期化された色を黒のままにしておくと、画面全体がほぼ瞬時に黒くなります。メニューが描画される最初のサイクルであると思われる 1 つのフレームがあり、黒い四角形がウィンドウに配置され、その後黒くなります。赤に 1.0 を指定すると、画像全体にある種の赤フィルターが配置され、メニュー ボックスに不透明な赤い四角形が描画されます。

レンダリング方法のいくつかの例を見てきましたが、何かが欠けているに違いありません。基本的に、すべてを行えば、テクスチャをサーフェスにバインドし、サーフェスの座標とテクスチャ バインディングを定義します。次に、クワッドをレンダリングします。メニューの glBegin() 内にカラー コールを配置し、4 つの頂点すべてでカラーを定義しました。

私の選んだ答えのおかげで:これで問題は解決しました。ただし、メニューオブジェクトを調整するために戻すまで、正しい色でメニューオブジェクトをレンダリングしませんでした。よくわかりませんが、私はそれをいじって、これを読んでそれについて学びます。ありがとうございました!

[SOVLED] 変更のみApp::OnRender():

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
MainScreen.RenderQuad(0,0,winWidth,winHeight);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
MainMenu.OnRender();
4

1 に答える 1

1

GL_TEXTURE_ENV_MODEGL_MODULATE入力テクセル値を現在の色で乗算するデフォルト。

現在の色が黒 ( RGB(0,0,0)) の場合、すべてのテクスチャが黒くレンダリングされます。単一チャネルの色についても同じ: RGB(1,0,0) * RGB(x,y,z) == RGB(x,0,0).

を使ってみてくださいGL_DECAL

于 2013-06-10T14:32:31.503 に答える