Я использую 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 ВСЕГДА сверху, в то время как треугольники вращаются вокруг друг друга.Если вы поменяете местами два вызова вершин треугольника, тогда зеленый треугольник всегда будет сверху.
Для меня это было огромной головной болью, поэтому любая информация будет полезна, как из 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();
}
}