2

OpenGL (LWJGL) を使用して Java で MineCraft のコピーを作成しようとしています。私が直面している問題は、2D オーバーレイのすべて (中央の照準クロス、メニューなど) がすべて白であることです。ゲームの 3D 部分はうまく機能します。すべての立方体には、それぞれの面にテクスチャがあります。

しかし、私が言ったように、オーバーレイを描画しようとすると、すべてのテクスチャは白ですが、その形状を見ることができます (透明な領域があるため)。その写真を追加します。

ここに画像の説明を入力 (これはインベントリのはずです)

ご覧のとおり、オーバーレイは完全に白です。そして、次のようになります。

ここに画像の説明を入力

私はすでに何時間もウェブを検索しています。解決策が見つからないようです。
これは私を夢中にさせます... 3D シーンに 2D オーバーレイを作成する方法の説明を既に検索しましたが、どちらも役に立ちません。だから私は、StackOverflow を試してみます。

うまくいけば、誰かが私を助けることができますか?私の質問を読んでくれて、そして(うまくいけば)答えてくれてありがとう!

マルティン

コードは次のとおりです。

OpenGL の初期化

public void initOpenGL() throws IOException
{
    // init OpenGL
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, 800, 600, 0, 1, 300);
    glMatrixMode(GL_MODELVIEW);

    float color = 0.9f;

    glClearColor(color, color, color, color);
    glEnable(GL_TEXTURE_2D);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

    glShadeModel(GL_FLAT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);

    glEnable(GL_LINE_SMOOTH);
    glEnable(GL_CULL_FACE);


    glEnable(GL_FOG);
    glFog(GL_FOG_COLOR, MineCraft.wrapDirect(color, color, color, 1.0f));
    glFogi(GL_FOG_MODE, GL_LINEAR);
    glFogf(GL_FOG_START, _configuration.getViewingDistance() * 0.8f);
    glFogf(GL_FOG_END, _configuration.getViewingDistance());
    glFogi(NVFogDistance.GL_FOG_DISTANCE_MODE_NV, NVFogDistance.GL_EYE_RADIAL_NV);
    glHint(GL_FOG_HINT, GL_NICEST);

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

オーバーレイを描画するためのマトリックスの構成(インスピレーションから、このメソッドのすべての OpenGL 呼び出しを BlockMania (別のオープンソース MineCraft コピー) から文字通りコピーしました。これはうまく機能します)

public void renderOverlay()
{
    glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    GLU.gluOrtho2D(0, conf.getWidth(), conf.getHeight(), 0);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_COLOR_MATERIAL);
    glPushMatrix();
    glLoadIdentity();

    glDisable(GL_CULL_FACE);
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    /** RENDER **/
    if (_activatedInventory != null)
    {
        _activatedInventory.renderInventory();
    }

    glDisable(GL_BLEND);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    glPopMatrix();
    glMatrixMode(GL_PROJECTION);
    glPopMatrix();
    glMatrixMode(GL_MODELVIEW);
}

テクスチャ自体の描画:

public void renderInventory()
{
    Configuration conf = Game.getInstance().getConfiguration();

    glTranslatef(conf.getWidth() / 2.0f, conf.getHeight() / 2.0f, 0.0f);

    glEnable(GL_TEXTURE_2D);
    Texture tex = TextureStorage.getTexture("gui.inventory");
    tex.bind(); // newdawn.slick (same library for my whole program, so this works)

    float hw = 170; // half width
    float hh = 163; // half height

    Vector2f _texPosUpLeft = new Vector2f(3, 0);
    Vector2f _texPosDownRight = new Vector2f(_texPosUpLeft.x + hw, _texPosUpLeft.y + hh);

    _texPosUpLeft.x /= tex.getTextureWidth();
    _texPosUpLeft.y /= tex.getTextureHeight();
    _texPosDownRight.x /= tex.getTextureWidth();
    _texPosDownRight.y /= tex.getTextureHeight();

    glColor3f(1, 1, 1); // Changes this doesn't make any effect
    glBegin(GL_QUADS);
    glTexCoord2f(_texPosUpLeft.x, _texPosUpLeft.y);
    glVertex2f(-hw, -hh);
    glTexCoord2f(_texPosDownRight.x, _texPosUpLeft.y);
    glVertex2f(hw, -hh);
    glTexCoord2f(_texPosDownRight.x, _texPosDownRight.y);
    glVertex2f(hw, hh);
    glTexCoord2f(_texPosUpLeft.x, _texPosDownRight.y);
    glVertex2f(-hw, hh);
    glEnd();
}

(使用しているテクスチャパックはCUBISM1.00です)

4

1 に答える 1

3

見つけた!!

霧でした。なんらかの理由で、オーバーレイが見えないと考えて、霧の色を与えているように見えます。そのため、オーバーレイをレンダリングする前にフォグを無効にすると解決しました。

glDisable(GL_FOG);

/* Render overlay here */

glEnable(GL_FOG);

これを読んでいる人がまだいる場合、これはマトリックスの乱用が原因ですか、それともこの動作は正常ですか?

于 2011-12-21T11:59:55.297 に答える