私は数日間JOGLを使用していますが、これが大きな障害になりつつあります。図形を正しい z オーダーで描画することができません。代わりに、OpenGL に指定された順序で図形が描画されます。
私はこれを調査するために過去数時間を費やしましたが、一般的な解決策 (および私の反応) は次のようです。
視錐台が正しいことを確認してください
- 錐台を再確認しましたが、正しいようです
- カスタムビルドの錐台の代わりに gluLookAt に切り替えました
- 問題がパースペクティブではないことを確認するためだけに、glOrthof に切り替えました。
- 私はまったくビューを設定していません。代わりに、デフォルトと思われる-1、1の範囲で作業しています
次の呼び出しが init にあることを確認します。
- gl.glEnable(GL.GL_DEPTH_TEST);
- gl.glDepthFunc(GL.GL_LEQUAL);
再描画のたびに深度バッファをクリアしていることを確認してください
- gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
この問題が発生しているプログラムの非常に基本的なサンプルを以下に示します。JOGL を使用して実行すると、Z 位置 -0.5f にある赤い三角形が常に一番上に表示され、三角形は互いに回転します。2 つの三角形の頂点呼び出しを入れ替えると、緑色の三角形が常に上になります。
これは私にとって大きな頭痛の種だったので、JOGL や OpenGL の一般的な洞察は役に立ちますが、何が間違っているのかわかりません。
また、簡潔にするために、ウィンドウを破棄するための適切なコードを削除したことに注意してください。
import java.awt.Frame;
import javax.media.opengl.GL;
import javax.media.opengl.GL2;
import javax.media.opengl.GLAutoDrawable;
import javax.media.opengl.GLEventListener;
import javax.media.opengl.awt.GLCanvas;
import javax.media.opengl.glu.GLU;
import com.jogamp.opengl.util.Animator;
public class JOGLTest implements GLEventListener
{
static GLU glu = new GLU();
static GLCanvas canvas = new GLCanvas();
static Frame frame = new Frame("JOGL test");
static Animator animator = new Animator(canvas);
float rot = 0.0f;
public void display(GLAutoDrawable glDrawable)
{
final GL2 gl = glDrawable.getGL().getGL2();
rot++;
gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glRotatef(rot, 0.0f, 1.0f, 0.0f);
gl.glBegin(GL.GL_TRIANGLES);
gl.glColor3f(0.0f, 1.0f, 0.0f);
gl.glVertex3f(0.0f, 1.0f, 0.0f);
gl.glVertex3f(-1.0f, -1.0f, 0.0f);
gl.glVertex3f(1.0f, -1.0f, 0.0f);
gl.glColor3f(1.0f, 0.0f, 0.0f);
gl.glVertex3f(-1.0f, 1.0f, -0.5f);
gl.glVertex3f(1.0f, 1.0f, -0.5f);
gl.glVertex3f(0.0f, 0.0f, -0.5f);
gl.glEnd();
}
public void dispose(GLAutoDrawable arg0)
{
}
public void init(GLAutoDrawable glDrawable)
{
GL2 gl = glDrawable.getGL().getGL2();
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
gl.glClearDepth(1.0f);
gl.glEnable(GL.GL_DEPTH_TEST);
gl.glDepthFunc(GL.GL_LEQUAL);
}
public void reshape(GLAutoDrawable arg0, int arg1, int arg2, int arg3,
int arg4)
{
}
public static void main(String[] args)
{
canvas.addGLEventListener(new JOGLTest());
frame.add(canvas);
frame.setSize(640, 480);
frame.setVisible(true);
animator.start();
canvas.requestFocus();
}
}