Я использую JOGL уже несколько дней, и теперь это становится серьезным препятствием. Я не могу заставить фигуры рисовать в правильном z-порядке, вместо этого они рисуются в том порядке, в котором они заданы OpenGL.
Я провел последние несколько часов, исследуя это, и общие решения (и мои реакции), похоже, следующие:
Убедитесь, что ваша усеченная пирамида правильная
- I have double checked the frustum, it seems correct
- Я переключился на gluLookAt вместо пользовательского усеченного конуса.
- Я переключился на glOrthof, чтобы убедиться, что проблема не в перспективе.
- Я даже вообще не устанавливал ЛЮБОЕ представление, вместо этого работая в диапазоне -1, 1, который кажется по умолчанию.
Убедитесь, что в инициализации есть следующие вызовы:
- 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 ВСЕГДА сверху, в то время как треугольники вращаются друг вокруг друга. Если вы поменяете местами вызовы двух вершин треугольника, зеленый треугольник всегда будет сверху.
Это было огромной головной болью для меня, поэтому любая информация будет полезна, будь то 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();
}
}