无法使用 VAO 和 VBO 渲染三角形-LWJGL3 (OpenGL 3.3)

Unable to render a triangle using VAOs and VBOs-LWJGL3 (OpenGL 3.3)

我没有收到任何错误,glGetErrors() 返回 0,着色器和编译,window 设置代码是直接从 LWJGL 网站复制的。 我阅读了所有我能找到的与此类问题相关的堆栈溢出答案,并尝试了他们的解决方案,但无济于事。 有人可以帮我修复我的代码吗?

实体代码:

public PlainEntity(float[] vertices,float[] texCoords,int[] indices,int ID){
    this.vertices=vertices;
    this.texCoords=texCoords;
    this.indices=indices;
    this.ID=ID;
    generateNormals();

    FloatBuffer verticesBuffer=MemoryUtil.memAllocFloat(vertices.length);
    FloatBuffer texBuffer=MemoryUtil.memAllocFloat(texCoords.length);
    FloatBuffer normBuffer=MemoryUtil.memAllocFloat(normals.length);
    IntBuffer indexBuffer=MemoryUtil.memAllocInt(indices.length);

    verticesBuffer.put(vertices).flip();
    normBuffer.put(normals).flip();
    texBuffer.put(texCoords).flip();
    indexBuffer.put(indices).flip();

    vaoID= GL30.glGenVertexArrays();
    indVBO=GL30.glGenBuffers();
    vertVBO=GL30.glGenBuffers();
    normVBO=GL30.glGenBuffers();
    texVBO=GL30.glGenBuffers();

    GL30.glBindVertexArray(vaoID);

    GL30.glBindBuffer(GL15.GL_ARRAY_BUFFER,vertVBO);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER,verticesBuffer,GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(0,3, GL11.GL_FLOAT,false,Float.SIZE*3,0);
    MemoryUtil.memFree(verticesBuffer);

    GL30.glBindBuffer(GL15.GL_ARRAY_BUFFER,normVBO);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER,normBuffer,GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(1,3, GL11.GL_FLOAT,false,Float.SIZE*3,0);
    MemoryUtil.memFree(normBuffer);

    GL30.glBindBuffer(GL15.GL_ARRAY_BUFFER,texVBO);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER,texBuffer,GL15.GL_STATIC_DRAW);
    GL20.glVertexAttribPointer(2,2, GL11.GL_FLOAT,false,Float.SIZE*2,0);
    MemoryUtil.memFree(texBuffer);

    GL30.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER,indVBO);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER,indexBuffer,GL15.GL_STATIC_DRAW);
    MemoryUtil.memFree(indexBuffer);

    GL30.glBindVertexArray(0);

着色器:

Shader shader=new Shader("""
        #version 330
                        
        layout (location=0) in vec3 position;
                        
        void main()
        {
            gl_Position = vec4(position, 0.0);
        }""",
        """
        #version 330
                                        
        out vec4 fragColor;
                                        
        void main()
        {
            fragColor = vec4(0.0, 0.5, 0.5, 1.0);
        }""");

绑定着色器:

public ShaderProgram (Shader shader){

    programID= GL20.glCreateProgram();
    try {
        vID = createShader(shader.vertex, GL20.GL_VERTEX_SHADER);
        fID = createShader(shader.fragment, GL20.GL_FRAGMENT_SHADER);
        GL20.glAttachShader(programID,vID);
        GL20.glAttachShader(programID,fID);
    }catch(Exception e){
        System.out.println("Could not create Shaders");
    }
    if(vID==0){
        System.out.println("error in vertex shader");
    }

    GL20.glLinkProgram(programID);
    GL20.glDetachShader(programID,vID);
    GL20.glDetachShader(programID,fID);
    GL20.glValidateProgram(programID);

    if (GL20.glGetProgrami(programID, GL20.GL_VALIDATE_STATUS) == 0) {
        System.err.println("Warning validating Shader code: " + GL20.glGetProgramInfoLog(programID, 1024));
    }
}

private int createShader (String source,int type){
    int shaderID=GL20.glCreateShader(type);

    GL20.glShaderSource(shaderID,source);
    GL20.glCompileShader(shaderID);

    if (GL20.glGetShaderi(shaderID,GL20.GL_COMPILE_STATUS) == 0) {
        System.err.println("Error compiling Shader code: " + GL20.glGetShaderInfoLog(shaderID, 1024));
    }

    GL20.glAttachShader(programID,shaderID);
    return shaderID;
}

public void bind(){
    GL20.glUseProgram(programID);
}

public void unbind(){
    GL20.glUseProgram(0);
}

渲染:

private void renderEntity(PlainEntity entity){
    GL30.glBindVertexArray(entity.getVAO());
    GL30.glEnableVertexAttribArray(0);
    GL30.glEnableVertexAttribArray(1);
    GL30.glEnableVertexAttribArray(2);
    GL30.glDrawElements(GL11.GL_TRIANGLES,entity.getVertexCount(),GL11.GL_UNSIGNED_INT,0);
}

public void render(ShaderProgram shader){
    shader.bind();
    for(PlainEntity entity: EntityManager.entities){
        renderEntity(entity);
    }
    shader.unbind();
}

Float.SIZE 不是 浮点数中的字节数(即 4),而是 bits 中的字节数浮动(即 32)。因此,像这样的行:

GL20.glVertexAttribPointer(0,3, GL11.GL_FLOAT,false,Float.SIZE*3,0);

错了。这应该读作:

GL20.glVertexAttribPointer(0,3, GL11.GL_FLOAT,false,Float.BYTES*3,0);

此外,您将 gl_Positionw 组件设置为 0.0,这将导致顶点位于无穷远。 您应该在顶点着色器中将其更改为 1.0