2

그래서 나는 another SO question regarding the command glVertexAttribPointer을보고 있었고 약간의 혼란이있었습니다. 이 질문에 대한 허용 대답은GL_ARRAY_BUFFER 버퍼를 여러 개 가질 수 있습니까?

을 설명하지만 전화를 걸 경우에도 속성 0 멀리 저장 상태의 추가 암시 조각이있다 : 데이터가 현재

GL_ARRAY_BUFFER

에 바인딩 버퍼에서 읽어

나에게 의미가 있지만, GL_ARRAY_BUFFER으로 바인드 된 버퍼가 여러 개인 경우 어떻게해야합니까? glVertexAttribPointer() 메서드는 속성을 설정하는 방법을 어떻게 알 수 있습니까?

예를 들어, 내 코드에서 그라디언트 삼각형을 그려야합니다. 이를 위해 2 개의 VBO를 만들었습니다. 하나는 배열에 컬러 데이터가 있고 다른 하나는 정점 위치입니다.

glGenVertexArrays(1, &vao); 
    glBindVertexArray(vao); 
    static const GLfloat points[] = { 
    //data here 
    }; 
    static const GLfloat colors[] = { 
     //data here 
    }; 
    glGenBuffers(1, &buffer); 
    glBindBuffer(GL_ARRAY_BUFFER, buffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW); 
    glEnableVertexAttribArray(0); 
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); 
    vs = glCreateShader(GL_VERTEX_SHADER); 
    fs = glCreateShader(GL_FRAGMENT_SHADER); 
    glShaderSource(vs, 1, &vertexShaderData, NULL); 
    glShaderSource(fs, 1, &fragShaderData, NULL); 
    glCompileShader(vs); 
    glCompileShader(fs); 
    sp=glCreateProgram(); 
    glBindFragDataLocation(sp, 0, "outColor"); 
    glAttachShader(sp, vs); 
    glAttachShader(sp, fs); 
    glLinkProgram(sp); 
    glUseProgram(sp); 
    glGenBuffers(1, &colorBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, colorBuffer); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW); 
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 
    glEnableVertexAttribArray(1); 
    glDrawArrays(GL_TRIANGLES, 0, 9); 

명령을 호출하면 사용할 버퍼를 어디에서 지정해야합니까?

답변

4

이것은 나에게 의미가 있지만, GL_ARRAY_BUFFER로 바인드 된 버퍼가 여러 개인 경우 어떻게해야합니까?

그건 불가능합니다. 버퍼 (또는 OpenGL 개체)를 대상에 바인딩하면 이전에 있던 내용이 자동으로 바인딩 해제됩니다.

OpenGL object targets은 전역 변수와 같습니다. 전역 정수를 3으로 설정하면 어떻게됩니까? 그것은 오래된 가치가 없어졌습니다.

glVertexAttribPointer 것이다 항상 현재GL_ARRAY_BUFFER에 바인딩 무엇이든 버퍼 사용. 처음 전화 할 때 buffer이 사용됩니다. 두 번째 호출에서는 colorBuffer이 사용됩니다.

여기에서 glVertexAttribPointer인데 현재 바운드로 작동한다는 것을 기억하는 것이 중요합니다. colorBuffer을 바인딩하고 속성 1에서 사용하도록 설정 한 후에도 속성 0 이 여전히buffer에서 정점 데이터를받습니다.

GL_ARRAY_BUFFER에 바인드 된 여러 버퍼를 가질 수는 없지만 버텍스 데이터의 소스로 여러 버퍼를 사용할 수 있습니다.

관련 문제