2

2D OpenGL ゲームの作成。フレームをレンダリングするときは、最初に計算されたクワッド ジオメトリを描画し、次にテクスチャ スプライトを描画する必要があります。render メソッドの本体がスプライトのみを描画する場合、すべて正常に動作します。ただし、スプライトの前に幾何学的なクワッドを描画しようとすると、スプライトのテクスチャが以前に使用された最後の GL.Color3 の色に変わります。OpenGL (まあ、OpenTK) に「OK、ジオメトリの描画が完了したので、スプライトに移る時が来ましたか?」と伝えるにはどうすればよいですか?

レンダリング コードは次のようになります。

        // Let's do some geometry 
        GL.Begin(BeginMode.Quads);
        GL.Color3(_dashboardBGColor);  // commenting this out makes my sprites look right

        int shakeBuffer = 100;
        GL.Vertex2(0 - shakeBuffer, _view.DashboardHeightPixels);
        GL.Vertex2(_view.WidthPixelsCount + shakeBuffer, _view.DashboardHeightPixels);
        GL.Vertex2(_view.WidthPixelsCount + shakeBuffer, 0 - shakeBuffer);
        GL.Vertex2(0 - shakeBuffer, 0 - shakeBuffer);

        GL.End();

        // lets do some sprites
        GL.Begin(BeginMode.Quads);
        GL.BindTexture(TextureTarget.Texture2D, _rockTextureId);

        float baseX = 200;
        float baseY = 200;

        GL.TexCoord2(0, 0); GL.Vertex2(baseX, baseY);
        GL.TexCoord2(1, 0); GL.Vertex2(baseX + _rockTextureWidth, baseY);
        GL.TexCoord2(1, 1); GL.Vertex2(baseX + _rockTextureWidth, baseY - _rockTextureHeight);
        GL.TexCoord2(0, 1); GL.Vertex2(baseX, baseY - _rockTextureHeight);  

        GL.End();

        GL.Flush();
        SwapBuffers();
4

1 に答える 1

3

デフォルトのテクスチャ環境モードは GL_MODULATE で、テクスチャ カラーと頂点カラーを乗算します。

簡単な解決策は、テクスチャ プリミティブを描画する前に頂点カラーを 1,1,1,1 に設定することです。

glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

もう 1 つの解決策は、テクスチャ環境モードを GL_REPLACE に変更することです。これにより、テクスチャ カラーが頂点カラーに置き換えられ、問題が発生しなくなります。

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

于 2011-04-09T20:06:53.207 に答える