【问题标题】:OpenGL vertex arrays throw invalid operation errorOpenGL顶点数组抛出无效操作错误
【发布时间】:2018-02-01 13:14:47
【问题描述】:

我最近开始使用 OpenGL 和 LWJGL,但是自从我尝试弄乱/添加顶点数组对象后,我就一遍又一遍地遇到同样的错误:

GL_INVALID_OPERATION

我很难理解原因,但我设法将问题归结为这些方法:

glEnableClientState(GL_VERTEX_ARRAY);
vao = glGenVertexArrays();

glBindVertexArray(vao);
glEnableVertexAttribArray(vao);     
glVertexAttribPointer(0, count, GL_FLOAT, false, Float.SIZE * 2, 0);

glBindVertexArray(0);

...所以基本上任何与顶点数组有关的东西都会抛出这个错误。如果有人能指出我到底做错了什么,那就太好了。这是我的其余代码:

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL30.*;

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

import org.lwjgl.BufferUtils; 

public class Model {

    private int count;
    private int ibo, vao;

    public Model(float[] vertices, int[] indices) {

        count = indices.length;

        glEnableClientState(GL_VERTEX_ARRAY);
        vao = glGenVertexArrays();

        glBindVertexArray(vao);
        glEnableVertexAttribArray(vao);
        glVertexAttribPointer(0, count, GL_FLOAT, false, Float.SIZE * 2, 0);

        glBindVertexArray(0);

        FloatBuffer vBuffer = BufferUtils.createFloatBuffer(vertices.length);
        vBuffer.put(vertices).flip();

        int vbo = glGenBuffers();
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glBufferData(GL_ARRAY_BUFFER, vBuffer, GL_STATIC_DRAW);

        IntBuffer iBuffer = BufferUtils.createIntBuffer(indices.length);
        iBuffer.put(indices).flip();

        ibo = glGenBuffers();
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, iBuffer, GL_STATIC_DRAW);

        glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

    }
    public void draw() {

        glBindVertexArray(vao);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);

        glDrawElements(GL_TRIANGLES, count, GL_UNSIGNED_INT, 0);

    }
}

【问题讨论】:

  • 您正在将固定功能代码与现代 OpenGL 混合。使用glEnableClientState/glVertexPointerglEnableVertexAttribArray/glVertexAttribPointer。您的目标是哪个 OpenGL 版本?

标签: java eclipse opengl lwjgl


【解决方案1】:

glEnableVertexAttribArray的参数是属性索引。这意味着您必须像这样更改代码:

glBindVertexArray( vao );
glEnableVertexAttribArray( 0 ); // <--- attribute index instead of object name

或者你可以使用glEnableVertexArrayAttrib:

glEnableVertexArrayAttrib( vao, 0 );


OpenGL 4.6 core profile specification, 10.3. VERTEX ARRAYS, page 354:

使用命令启用顶点数组对象中的单个通用顶点属性数组

void EnableVertexAttribArray( uint index );
void EnableVertexArrayAttrib( uint vaobj, uint index );


请注意,glEnableClientState 是已弃用的固定功能管道的一部分。如果要使用固定功能管道和glEnableClientState,则必须使用glVertexPointer 而不是glVertexAttribPointer

【讨论】:

    猜你喜欢
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多