Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用JOGL绘制简单形状_Java_Opengl_Jogl - Fatal编程技术网

Java 使用JOGL绘制简单形状

Java 使用JOGL绘制简单形状,java,opengl,jogl,Java,Opengl,Jogl,我正在努力学习Java上的OpenGL,但遇到了一些问题 我已经看过了很多教程,但是我发现的大多数信息都使用了不推荐的方法或者C++。 我想显示一个简单的三角形,但我的代码似乎不起作用 它可以编译,但只显示一个帧 请帮忙。我也将感谢任何好的来源,以便进一步阅读(因为我找不到任何) 多谢各位 public class JOGL extends JFrame implements GLEventListener { int width = 600; int height = 600;

我正在努力学习Java上的OpenGL,但遇到了一些问题

我已经看过了很多教程,但是我发现的大多数信息都使用了不推荐的方法或者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),您可以避免犯一些基本的错误:提醒:这是维基百科上提到的,您不会错过的。谢谢大家,这是我真正需要的!