JOGAMP 简单三角形未显示在屏幕上

问题描述

我正在尝试在窗口中显示一个三角形。我让窗口出现,但窗口是黑色的,窗口中没有出现三角形。着色器文件可以打开(如果不能打开,我会收到 FileNotFoundException),但是三角形不会显示在屏幕上。这是我拥有的代码

public class GoodbyeSimpleWorld implements GLEventListener,KeyListener {

    private static GLWindow window;
    private static Animator animator;

    float vertices[] = {
            -0.5f,-0.5f,0.0f,0.5f,0.0f
    };

    int shaderProgram;
    IntBuffer VAO;
    IntBuffer VBO;
    int iVBO,iVAO;

    public static void main(String[] args) {
        new GoodbyeSimpleWorld().setup();
    }

    private void setup() {

        GLProfile glProfile = GLProfile.get(GLProfile.GL3);
        GLCapabilities glCapabilities = new GLCapabilities(glProfile);

        window = GLWindow.create(glCapabilities);

        window.setTitle("Goodbye Simple World");
        window.setSize(1024,768);

        window.addGLEventListener(this);
        window.addKeyListener(this);

        window.setVisible(true);

        window.addGLEventListener(this);
        window.addKeyListener(this);

        window.addWindowListener(new WindowAdapter(){
            @Override
            public void windowDestroyed(WindowEvent e) {
                animator.stop();
                System.exit(0);
            }
        });

        animator = new Animator();
        animator.start();

    }


    @Override
    public void init(GLAutoDrawable drawable) {
        GL3 gl = drawable.getGL().getGL3();

        shadercode vertexShader = shadercode.create(gl,GL_VERTEX_SHADER,this.getClass(),"shaders/gl3",null,"goodbye","vert",true);
        vertexShader.compile(gl);

        shadercode fragmentShader = shadercode.create(gl,GL_FRAGMENT_SHADER,"frag",true);
        fragmentShader.compile(gl);

        shaderProgram = gl.glCreateProgram();
        gl.glAttachShader(shaderProgram,vertexShader.id());
        gl.glAttachShader(shaderProgram,fragmentShader.id());
        gl.glLinkProgram(shaderProgram);
        gl.glDeleteShader(vertexShader.id());
        gl.glDeleteShader(fragmentShader.id());
        VBO = GLBuffers.newDirectIntBuffer(1);
        VAO = GLBuffers.newDirectIntBuffer(1);

        gl.glGenVertexArrays(1,VAO);
        gl.glGenBuffers(1,VBO);

        iVBO = VBO.get();
        iVAO = VAO.get();

        gl.glBindVertexArray(iVAO);

        gl.glBindBuffer(GL.GL_ARRAY_BUFFER,iVBO);
        gl.glBufferData(GL.GL_ARRAY_BUFFER,vertices.length,FloatBuffer.wrap(vertices),gl.GL_STATIC_DRAW);

        gl.glVertexAttribPointer(0,3,GL.GL_FLOAT,false,3 * Float.BYTES,0);
        gl.glEnabLevertexAttribArray(0);

        gl.glBindBuffer(GL.GL_ARRAY_BUFFER,0);

        gl.glBindVertexArray(0);
    }

    @Override
    public void display(GLAutoDrawable drawable) {
        GL3 gl = drawable.getGL().getGL3();
        drawable.setAutoSwapBufferMode(true);
        gl.gluseProgram(shaderProgram);
        gl.glBindVertexArray(iVAO);
        gl.glDrawArrays(GL_TRIANGLES,3);
        gl.glBindVertexArray(iVAO);
    }
...
}

解决方法

我发现了几个问题:

  • VBO 是包含 VBO 的 name 的缓冲区,但是您将它传递给 glBufferData,您要在其中存储数据 VBO 是预期的,您永远不会将 vertices 数组复制到缓冲区中
  • 你用 glVertexAttribPointer 调用 Long.MIN_VALUE,它大约是 -2^63,但你应该放在那里的值是 0
  • 当您进行实际绘制调用时,您没有绑定 VAO
  • 您永远不会在任何地方接到 SwapBuffers 电话。请注意,可以将 GLEventListener 设置为 setAutoSwapBufferMode 模式来为您执行此操作,但这只会影响 dispay 方法,在 init 中调用绘制调用没有多大意义。