gpt4 book ai didi

java - JFrame + Canvas : why do I get a NUllPointerException when calling glViewport?

转载 作者:行者123 更新时间:2023-12-01 15:54:55 25 4
gpt4 key购买 nike

我创建了一个带有 Canvas 的 JFrame,如下面的代码所示。我想做的是在屏幕尺寸更新时调整 openGL 上下文的大小。这应该像调用 glViewport() 一样简单,我在名为 resize() 的事件处理程序中执行此操作。然而,这会导致:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at org.lwjgl.opengl.GL11.glViewport(GL11.java:3199)
at gltest.GameMain.resize(GameMain.java:149)
at gltest.GameMain$1.componentResized(GameMain.java:59)
(...)

我完全没有头绪。从 Canvas 大小返回的边界似乎没问题,但是一旦我在视口(viewport)上使用它们,它们就会抛出错误。当我改为像“glViewport(1, 1, 100, 100)”这样进行视口(viewport)调用时,也会发生同样的情况。所有这些值都在窗口的边界内,但当我调整窗口大小时,它仍然抛出相同的 nullPointerExceptions。

我没有想法和精力去找出原因(我已经用谷歌搜索了 3 个小时,没有结果)。我做错了什么?

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;

import javax.swing.JFrame;

import org.lwjgl.LWJGLException;
import org.lwjgl.Sys;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;

import static org.lwjgl.util.glu.GLU.*;
import static org.lwjgl.opengl.GL11.*;

public class GameMain {
public JFrame frame;
public Canvas canvas;

public boolean initialize(int width, int height) {
try {
Canvas canvas = new Canvas();
JFrame frame = new JFrame("Open Rock Raiders - Delta");
this.canvas = canvas;
this.frame = frame;
ComponentAdapter adapter = new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
resize();
}
};

canvas.addComponentListener(adapter);
canvas.setIgnoreRepaint(true);
frame.setSize(640, 480);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(canvas);
frame.setVisible(true);
Dimension dim = this.canvas.getSize();

Display.setLocation(100, 100);
Display.setTitle("GL Window");
Display.setDisplayMode(new DisplayMode(dim.width, dim.height));
Display.setParent(canvas);
Display.create();

//openGL setup
glViewport(0, 0, dim.width, dim.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0f, (float)(dim.width/dim.height), 0.1f, 10000.0f);
glMatrixMode(GL_MODELVIEW);
glClearColor(94.0f/255.0f, 161.0f/255.0f, 255.0f/255.0f, 0.5f);
glClearDepth(1.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL11.GL_CULL_FACE);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
} catch (LWJGLException le) {
le.printStackTrace();
}
return false;
}

public void resize()
{
Dimension dim = this.canvas.getSize();
GL11.glViewport(0, 0, dim.width, dim.height);
}
}

最佳答案

您应该从主线程执行所有显示操作。如果您查看在其他问题中发布的示例,您可以看到新的 Canvas 大小被存储,然后由主线程更新。它也是线程安全完成的。您需要这样做,然后在图形初始化后进行循环,如下所示:

while (!closeRequested) {
GL11.glViewport(0, 0, dim.width, dim.height);
Display.update();
}

//finished
Display.destroy();

关于java - JFrame + Canvas : why do I get a NUllPointerException when calling glViewport?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5266680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com