-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 と頂点属性の両方が頂点データを取得します。

ここで何がうまくいかないのですか?

4

1 に答える 1