glCallList не имеет эффекта кодирования в JOGL
Ничего не появляется, когда я пытаюсь визуализировать свой треугольник, используя список отображения. Кто-нибудь может сказать мне, почему?
внутри метода display(), вызывающего renderTriangle(gl, 100); работает как положено, на экране появляется треугольник шириной 200 пикселей. Но gl.glCallList(список); звонок, кажется, не имеет никакого эффекта. Ничего не появляется на экране вообще.
Для тех, кто не знаком с JOGL, вот порядок вызовов методов. инициализация, изменение формы, отображение, отображение, отображение...
Мой метод buildDisplayList в порядке? Является ли вызов glCallList правильным? Должен ли я иметь какие-либо дополнительные настройки, чтобы это работало?
public class TriDemo extends GLJPanel implements GLEventListener {
private int list;
public TriDemo(GLCapabilities glCapabilities, int width, int height) {
super(glCapabilities);
this.setPreferredSize(new Dimension(width, height));
this.addGLEventListener(this);
}
private void renderTriangle(GL2 gl, float size) {
gl.glBegin(GL_TRIANGLES);
gl.glVertex3f(-1*size, -1*size, 0);
gl.glVertex3f(1*size, -1*size, 0);
gl.glVertex3f(0*size, 1*size, 0);
gl.glEnd();
}
private void buildDisplayList(GL2 gl) {
list = gl.glGenLists(1);
gl.glNewList(list, GL_COMPILE);
renderTriangle(gl, 100);
gl.glEndList();
}
@Override
public void init(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glClearColor(0, 0, 0.2f, 1);
buildDisplayList(gl);
}
@Override
public void dispose(GLAutoDrawable drawable) { }
@Override
public void display(GLAutoDrawable drawable) {
GL2 gl = drawable.getGL().getGL2();
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
gl.glColor3f(0, 1, 0);
//renderTriangle(gl, 100);
gl.glCallList(list);
}
@Override
public void reshape(GLAutoDrawable drawable, int x, int y, int width, int height) {
GL2 gl = drawable.getGL().getGL2();
GLU glu = GLU.createGLU(gl);
gl.glMatrixMode(GL_PROJECTION);
gl.glLoadIdentity();
glu.gluOrtho2D(-width/2, width/2, -height/2, height/2);
gl.glMatrixMode(GL_MODELVIEW);
gl.glLoadIdentity();
gl.glViewport(0, 0, width, height);
}
}
Другой класс для работающего примера:
public class AppWindow extends JFrame {
public AppWindow() {
super("Tri Test);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
GLProfile glProfile = GLProfile.getDefault();
GLCapabilities glCapabilities = new GLCapabilities(glProfile);
GLJPanel panel = new TriDemo(glCapabilities, 800, 600);
FPSAnimator animator = new FPSAnimator(panel, 60);
animator.start();
this.getContentPane().add(panel);
this.pack();
this.setVisible(true);
}
public static void main(String[] args) {
new AppWindow();
}
1 ответ
Ваш buildDisplayList()
Функция вызывается до того, как ваш видовой экран готов. Это причина, по которой на экране ничего не отображается. buildDisplayList()
должен быть вызван в display()
функция т.е. после окна просмотра и инициализации GL.