顶点属性数组\不接收LWJGL中的顶点数据

时间:2013-08-12 14:36:57

标签: java opengl lwjgl

似乎无法使顶点属性数组适用于每个顶点数据。

这是SSCCE:

private static void createDisplay(int w, int h) {
    try {
        Display.create();
        Display.setDisplayMode(new DisplayMode(w, h));
    }
    catch (LWJGLException e) {
        e.printStackTrace();
    }

    float size = 1;
    float aspect = (float) Display.getWidth() / Display.getHeight();
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(-size * aspect, size * aspect, -size, size, -1, 1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();

}

public static void main(String[] args) {
    createDisplay(1200, 800);
    GL11.glViewport(0, 0, Display.getWidth(), Display.getHeight());

    ShaderManager.createShader("2Dv", new File("src/Shaders/2D.vert"), SHADER_VERT);
    ShaderManager.createShader("2Df", new File("src/Shaders/2D.frag"), SHADER_FRAG);
    ShaderManager.createProgram("2D", "2Dv", "2Df");
    // Shader compiles and links correctly.
    ShaderManager.useProgram("2D");
    // Calls glUseProgram(programID);

    float[] vertexData = new float[] {-0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f};

    int vao = GL30.glGenVertexArrays();
    if (vao == 0)
        System.exit(-1);
    GL30.glBindVertexArray(vao);
    int vertexBuffer = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ARRAY_BUFFER, vertexBuffer);
    GL15.glBufferData(GL15.GL_ARRAY_BUFFER, BufferUtil.asDirectFloatBuffer(vertexData), GL15.GL_DYNAMIC_DRAW);

    // GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
    // GL11.glVertexPointer(2, GL11.GL_FLOAT, 2 * 4, 0);

    int loc = ShaderManager.currentProgram.getAttribute("vertex");
    if (loc == -1)
        Debug.log(Debug.INSTANCE_MANAGEMENT, "Attribute [", "", "] not found in Shader [",
                ShaderManager.currentProgram.toString(), "].");
    else {
        GL20.glVertexAttribPointer(loc, 2, GLCONST.TYPE_FLOAT, false, 2 * 4, 0);
        GL20.glEnableVertexAttribArray(loc);
    }

    GL30.glBindVertexArray(0);

    GL11.glColor3f(1, 0, 0);
    GL11.glClearColor(0.5f, 0.5f, 0.8f, 1);

    int indexBuffer = GL15.glGenBuffers();
    GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
    GL15.glBufferData(GL15.GL_ELEMENT_ARRAY_BUFFER, BufferUtil.asDirectFloatBuffer(new float[] {0, 1, 2, 3}),
            GL15.GL_DYNAMIC_DRAW);

    while (!Display.isCloseRequested()) {
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

        GL30.glBindVertexArray(vao);
        GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, indexBuffer);
        GL11.glDrawElements(GL11.GL_QUADS, 4, GL11.GL_UNSIGNED_INT, 0);
        GL30.glBindVertexArray(0);

        Display.update();
        int error = GL11.glGetError();
        if (error != GL11.GL_NO_ERROR)
            System.out.println(GLU.gluErrorString(error));
    }

}

问题在于使用顶点属性数组。我使用的旧代码是:

GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
GL11.glVertexPointer(2, GL11.GL_FLOAT, 2 * 4, 0);

新版本是:

int loc = ShaderManager.currentProgram.getAttribute("vertex");//Call to glGetAttribLocation();
if (loc == -1){
    System.exit(-1);
}
GL20.glVertexAttribPointer(loc, 2, GL11.GL_FLOAT, false, 2 * 4, 0);
GL20.glEnableVertexAttribArray(loc);

原始代码是评论的2行。在运行时,这正确地将顶点数据发送到gl_Vertex并呈现大小为1的正方形。

新代码shuld将顶点数据发送到顶点属性,但它什么都没有。

当原始代码被取消注释并且使用旧代码和新代码时,gl_Vertex和vertex属性都获得顶点数据。

这里出了什么问题?

1 个答案:

答案 0 :(得分:0)

所以我过了一会儿才发现问题。问题是由于使用OpenGL 3.0+核心配置文件时出现AMD驱动程序错误。

“vertex”属性数组的位置为1。

当未使用属性数组0时,会发生错误。如果未启用数组0,则不会呈现任何内容。

为了解决这个问题,我只是将“顶点”明确指定给位置0。

layout(location = 0) in vec4 vertex;