Java 使用JOGL绘制简单形状
我正在努力学习Java上的OpenGL,但遇到了一些问题Java 使用JOGL绘制简单形状,java,opengl,jogl,Java,Opengl,Jogl,我正在努力学习Java上的OpenGL,但遇到了一些问题 我已经看过了很多教程,但是我发现的大多数信息都使用了不推荐的方法或者C++。 我想显示一个简单的三角形,但我的代码似乎不起作用 它可以编译,但只显示一个帧 请帮忙。我也将感谢任何好的来源,以便进一步阅读(因为我找不到任何) 多谢各位 public class JOGL extends JFrame implements GLEventListener { int width = 600; int height = 600;
我已经看过了很多教程,但是我发现的大多数信息都使用了不推荐的方法或者C++。 我想显示一个简单的三角形,但我的代码似乎不起作用
它可以编译,但只显示一个帧 请帮忙。我也将感谢任何好的来源,以便进一步阅读(因为我找不到任何) 多谢各位public class JOGL extends JFrame implements GLEventListener {
int width = 600;
int height = 600;
static float[] vertices_position = {
0.0f, 0.0f,
0.5f, 0.0f,
0.5f, 0.5f,
};
FloatBuffer bufPos = Buffers.newDirectFloatBuffer(vertices_position);
int vertexbuffer[] = new int[1];
public JOGL() {
super("Minimal OpenGL");
GLProfile profile = GLProfile.get(GLProfile.GL4);
GLCapabilities capabilities = new GLCapabilities(profile);
GLCanvas canvas = new GLCanvas(capabilities);
canvas.addGLEventListener(this);
this.setName("Minimal OpenGL");
this.getContentPane().add(canvas);
this.setSize(width, height);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setResizable(false);
canvas.requestFocusInWindow();
}
private int program;
@Override
public void init(GLAutoDrawable glad) {
GL4 gl = glad.getGL().getGL4();
gl.glClearColor(0.392f, 0.584f, 0.929f, 1.0f);
program = gl.glCreateProgram();
}
@Override
public void dispose(GLAutoDrawable glad) {
}
@Override
public void display(GLAutoDrawable glad) {
GL4 gl = glad.getGL().getGL4();
// gl.glFlush();
gl.glGenBuffers(1, vertexbuffer, 0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vertexbuffer[0]);
gl.glBufferData(GL.GL_ARRAY_BUFFER, bufPos.capacity(), bufPos, GL.GL_STATIC_DRAW);
gl.glEnableVertexAttribArray(0);
gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vertexbuffer[0]);
gl.glVertexAttribPointer(
0,
3,
GL.GL_FLOAT,
false,
0,
0
);
gl.glDrawArrays(GL.GL_TRIANGLES, 0, 3);
gl.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
}
@Override
public void reshape(GLAutoDrawable glad, int i, int i1, int i2, int i3) {
}
public static void main(String args[]) {
JOGL n = new JOGL();
}
}
您绝对不应该在每一帧中创建一个新的缓冲区。创建一个,然后在显示功能中使用它。但问题可能来自于此:
bufPos.capacity()
提供缓冲区中的浮点数,而不是字节数。您必须将它乘以Buffers.SIZEOF_FLOAT。这里缺少很多。即使你找到的教程是C++,你仍然应该能够遵循代码流。例如,在display()
方法的末尾有glClear()
。这属于开始,因为您希望在开始绘制之前清除帧缓冲区,而不是在结束时擦除所有内容。您正在创建一个着色器程序,但从未设置或使用它。现在,一个简单的现代示例可以使用Xerxes的示例和我的示例:上面的Elect示例不使用不推荐使用的函数。我同意Reto Koradi的观点,通过查看我的示例(即使它没有使用VBO),您可以避免犯一些基本的错误:提醒:这是维基百科上提到的,您不会错过的。谢谢大家,这是我真正需要的!