-1

似乎无法让每个顶点数据的顶点属性数组正常工作。

这是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 的正方形。

新代码应该将顶点数据发送到顶点属性,但它什么也得不到。

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

这里出了什么问题?

4

1 回答 1

0

所以我在一段时间后发现了问题。该问题是由于使用 OpenGL 3.0+ 核心配置文件时的 AMD 驱动程序错误造成的。

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

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

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

layout(location = 0) in vec4 vertex;

于 2013-08-18T21:54:18.430 回答