4

私はこのコードを持っています: https://github.com/magicgoose/lwjgl-nifty-test-project GUI のみをレンダリングすると、期待どおりに動作します。三角形を (透視投影で) レンダリングしてから GUI をレンダリングしようとすると、すべてが失敗し、GUI でさえ正しくレンダリングされません。黒い背景に文字しか表示されません。draw_something()(メソッド内のステートメントのコメントを外すと発生 しdisplay(...)ます)

private def draw_something() {
    glTranslatef(0, 0, -20)
    glBegin(GL_TRIANGLES)
    glVertex3f(0.0f, 1.0f, 0.0f)
    glVertex3f(-1.0f, -1.0f, 0.0f)
    glVertex3f(1.0f, -1.0f, 0.0f)
    glEnd()
}

私が間違っていることは何ですか?背景に気の利いたGUIと3Dグラフィックを使用した実用的な例を探してみましたが、うまくいきませんでした。

更新 1

datenwolf の回答に基づいてコードを変更しました。GUI は正常にレンダリングされるようになりましたが、白い三角形が数ミリ秒しか表示されません (実際には 1 つのフレームにあるのでしょうか?)。3D セットアップが「破損」しているようです。 ...これは、GUIをレンダリングした場合にのみ発生し、行にコメントするとgui.render(false)、白い三角形が画面に残ります。

更新 2

3D パーツにいくつかのモーションを追加しました (リポジトリの更新を参照)。三角形がほとんど見えなくなっていることがわかります (Z ファイティングのように見えます)。

4

3 に答える 3

4

正投影と透視投影を切り替える必要があります。display_ready2dこのために、(オルソ投影行列をdisplay_ready3d設定する) と (透視投影を設定する) の2 つの関数が用意されています。

残念ながら、display_ready3d 関数は、変更を適用する前にマトリックス スタックをリセットしません。gluPerspective を呼び出す前に、glLoadIdentity を追加する必要があります。また、マトリックス設定を切り替えられるようにするため、これらの関数でフレームバッファをクリアしないでください。したがって、これを次のように変更します。

private def display_ready3d(fov: Float, aspect: Float) {
    glMatrixMode(GL_PROJECTION)
            glLoadIdentity();
    gluPerspective(fov, aspect, 0.01f, 100.0f)

    glMatrixMode(GL_MODELVIEW)
    glLoadIdentity()

    glEnable(GL_DEPTH_TEST)
}

GUI を描画する直前の display_ready2d と、draw_something の前の display_ready3d。また、深度バッファをカバーする必要がある clear コマンドもそこに配置する必要があります。また、クリア カラーのアルファ値は 1 にする必要があります (透明なウィンドウを作成した場合を除く)。

def display(width: Int, height: Int, AR: Float, gui: Nifty) {
            glViewport(0, 0, width, height)
            glClearDepth(1.)
            glClearColor(0., 0., 0., 1.)
            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    display_ready3d(90, width/height)
    draw_something()

    display_ready2d(width, height)
    gui.render(false)

    glFlush()
    Display.update()
}
于 2012-11-29T00:25:33.410 に答える
1

これを実現するために、プロジェクトの 1 つで次のコードを使用していました。datenwolf のソリューションとの主な違いは、GUI モードから切り替えるたびに 3D パースペクティブを設定する必要がないことです。私の場合、かなり複雑な 3D パースペクティブ セットアップを使用しているため、このようなプッシュ/ポップ マトリックス アプローチに依存する方が便利です。

3D モードで稲妻を有効にしている場合は、GUI モードの稲妻をオフにして、GUI の色がライトの影響を受けないようにすることも検討してください。

def enableOrthoView(winW: Int, winH: Int) {   
  glMatrixMode(GL_PROJECTION)                 // Select projection
  glPushMatrix()                              // Push the matrix
  glLoadIdentity()                            // Reset the matrix
  glOrtho(0, winW, winH, 0, -1, 1)            // Select ortho mode
  glMatrixMode(GL_MODELVIEW)                  // Select Modelview matrix
  glPushMatrix()                              // Push the Matrix
  glLoadIdentity()                            // Reset the Matrix
  glDisable(GL_DEPTH_TEST)                    // Cure z-fighting
  glDisable(GL_LIGHTING)                      // Ensure unaffected colors
}

def disableOrthoView() {
  glMatrixMode(GL_PROJECTION)                 // Select projection
  glPopMatrix()                               // Pop the matrix
  glMatrixMode(GL_MODELVIEW)                  // Select Modelview
  glPopMatrix()                               // Pop the matrix
  glEnable(GL_DEPTH_TEST)    
  glEnable(GL_LIGHTING)
}
于 2012-11-29T08:59:28.780 に答える
0

3D グラフィックのちらつき/消失の問題の原因を突き止めました。OpenGLでは、テクスチャを提供せずにジオメトリを描画する場合、テクスチャリングを無効にする必要があるため、私は書きました

glDisable(GL_TEXTURE_2D)

display_ready3d(...)そして今、すべてがやらなければならないことをします。https://gamedev.stackexchange.com/questions/44437/lwjgl-mixing-2d-and-3d また、 と のおかげで、あなたの助けは非常に貴重ですdatenwolfbluenote10

于 2012-11-29T22:31:23.743 に答える