微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

尝试在JOGLOpenGL中使用VBO和VAO会引发异常,其中找不到缓冲区

如何解决尝试在JOGLOpenGL中使用VBO和VAO会引发异常,其中找不到缓冲区

我完全被困在这里,所以任何帮助将不胜感激:/

我正在尝试通过Java绑定JOGL学习如何使用OpenGL 4.0。似乎现在最好使用VBO / VAO,而不是glBegin / End。

我关注各种消息来源,但在此特定方面,我使用了以下内容https://learnopengl.com/Getting-started/Hello-Triangle(C ++)

不幸的是,当我运行程序时,它抛出以下异常(@ 41行): “ Exception in thread "AWT-EventQueue-0" com.jogamp.opengl.GLException: Caught GLException: GL_INVALID_OPERATION: Buffer for target 0x8892 not bound on thread AWT-EventQueue-0

这是我完整的GLEventListener实现类(Renderer):

package pRendering;

import com.jogamp.common.nio.Buffers;
import com.jogamp.opengl.GL;
import com.jogamp.opengl.GL4;
import com.jogamp.opengl.GLAutoDrawable;
import com.jogamp.opengl.GLEventListener;

import java.nio.FloatBuffer;
import java.nio.IntBuffer;

public class Renderer implements GLEventListener {

    public int vShaderProgramID;
    public int vVertShaderID;
    public int vFragShaderID;

    public int vVBO_ID;
    public IntBuffer vVBO; //uint pointer?

    public int vVAO_ID;
    public IntBuffer vVAO; //uint pointer?

    //region tmp
    float vertices[] = {
            -0.5f,-0.5f,0.0f,0.5f,0.0f
    };
    //endregion

    private void TriangleVBO_VAO(GL4 vGL){
        FloatBuffer vVertFloatBuffer = Buffers.newDirectFloatBuffer(vertices);

        vGL.glGenVertexArrays(1,vVAO);
        vGL.glGenBuffers(1,vVBO);

        vGL.glBindVertexArray(vVAO_ID);

        vGL.glBindBuffer(GL.GL_ARRAY_BUFFER,vVBO_ID);
        vGL.glBufferData(GL.GL_ARRAY_BUFFER,vVertFloatBuffer.capacity() * Buffers.SIZEOF_FLOAT,vVertFloatBuffer,GL.GL_STATIC_DRAW); // <---

        vGL.glVertexAttribPointer(0,3,GL.GL_FLOAT,false,3 * 4 /*sizeof(float)*/,0);
        vGL.glEnabLevertexAttribArray(0);

        vGL.glBindBuffer(GL.GL_ARRAY_BUFFER,0);

        vGL.glBindVertexArray(0);
    }

    @Override
    public void init(GLAutoDrawable glAutoDrawable) {
        GL4 vGL = glAutoDrawable.getGL().getGL4();

        vShaderProgramID = vGL.glCreateProgram();
        try {
            vVertShaderID = Shaders.CreateShader(vGL,vShaderProgramID,GL4.GL_VERTEX_SHADER,"C:\\Users\\quent\\Desktop\\def.vshd");
            vFragShaderID = Shaders.CreateShader(vGL,GL4.GL_FRAGMENT_SHADER,"C:\\Users\\quent\\Desktop\\def.fshd");

            Shaders.Link(vGL,vShaderProgramID);
        } catch (Exception EX) {
            EX.toString();
        }

        TriangleVBO_VAO(vGL);
    }

    @Override
    public void display(GLAutoDrawable glAutoDrawable) {
        GL4 vGL = glAutoDrawable.getGL().getGL4();

        vGL.glClear(GL4.GL_COLOR_BUFFER_BIT | GL4.GL_DEPTH_BUFFER_BIT);

        vGL.gluseProgram(vShaderProgramID);

        vGL.glBindVertexArray(vVAO_ID);

        vGL.glDrawArrays(GL.GL_TRIANGLES,3);
    }

    @Override
    public void dispose(GLAutoDrawable glAutoDrawable) {
        GL4 vGL = glAutoDrawable.getGL().getGL4();

        vGL.glDetachShader( vShaderProgramID,vVertShaderID);
        vGL.glDetachShader( vShaderProgramID,vFragShaderID);
        vGL.glDeleteProgram(vShaderProgramID);
    }

    @Override
    public void reshape(GLAutoDrawable glAutoDrawable,int i,int i1,int i2,int i3) {

    }
}

解决方法

顶点数组对象和缓冲区对象的名称分别包含在IntBuffer个对象vVAO vVBO中。您错过了将IntBuffer的内容分别分配给属性vVAO_ID vVBO_ID的情况:

vVAO = GLBuffers.newDirectIntBuffer(1);
vVBO = GLBuffers.newDirectIntBuffer(1);

vGL.glGenVertexArrays(1,vVAO);
vVAO_ID = vVAO.get();

vGL.glGenBuffers(1,vVBO);
vVBO_ID = vVBO.get();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。