尝试在JOGL(OpenGL)中使用VBO和VAO会抛出异常,其中缓冲区找不到。

huangapple go评论76阅读模式
英文:

Trying to use VBOs & VAOs in JOGL (OpenGL) throws an exception wherein a buffer cannot be found

问题

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;

    public int vVAO_ID;
    public IntBuffer vVAO;

    //region tmp
    float vertices[] = {
            -0.5f, -0.5f, 0.0f,
            0.5f, -0.5f, 0.0f,
            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, 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, vShaderProgramID, 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, 0, 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) {

    }
}
英文:

I am completely stuck here, so any help would be appreciated :/

I'm trying to learn how to use OpenGL 4.0 using it's Java Bindings, JOGL. It seems like now it's better to use VBO/VAOs as opposed to glBegin/End.

I'm following various sources, but for this specific aspect I used this: https://learnopengl.com/Getting-started/Hello-Triangle (C++)

Unfortunately, when I run my program, it throws the following exception (@ Line 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"

Here's my full GLEventListener implementing class (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.5f, 0.0f,
            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, vShaderProgramID, 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, 0, 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) {

    }
}

答案1

得分: 2

顶点数组对象(Vertex Array Object)和缓冲对象(Buffer Object)的名称分别包含在IntBuffer对象vVAOvVBO中。您忘记将IntBuffer的内容分配给属性vVAO_IDvVBO_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();
英文:

The name of the vertex array object and the buffer object is contained in the IntBuffer objects vVAO respectively vVBO. You missed to assign the content of the IntBuffers to the attributes vVAO_ID respectively 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();

huangapple
  • 本文由 发表于 2020年9月21日 03:39:42
  • 转载请务必保留本文链接:https://go.coder-hub.com/63982959.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定