OpenGL

OpenGL 공부하기 #3 - VAO, VBO, EBO

NAEU 2025. 7. 5. 00:41

VAO (Vertex Array Object)

정점의 속성 구조를 저장하는 객체임

버텍스를 어떻게 해석할지 정의함 ex. 첫 3개 float은 xyz, 4번째부터 3개 flaot은 색상값 등
glGenVertexArrays()로 생성함
glBindVertexArray()로 바인딩 후 설정 저장 및 사용 가능
여러 VAO 생성하여 각각 다른 설정 가능

VBO (Vertex Buffer Object)

실제 정점 데이터를 GPU에 저장함
glGenBuffers()로 생성함
glBindBuffer(GL_ARRAY_BUFFER, id)로 바인딩함
glBufferData()로 버텍스 데이터 전송함 (데이터 복사 후 삽입)
GL_STATIC_DRAW → 자주 바뀌지 않는 데이터에 사용함

float vertices[] = {
    x, y, z, r, g, b
};

EBO (Element Buffer Object)

정점 인덱스를 통해 중복 없이 재사용 가능함
glGenBuffers() → EBO 생성함
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)로 바인딩함
glDrawElements() 호출 시 사용함
예제에서는 glDrawArrays() 사용 중 → EBO 사용 안함

unsigned int indices[] = { 
    0, 1, 2,  
    3, 4, 5
};

glVertexAttribPointer() - VAO

버텍스 구조를 OpenGL에 설명함
ex) location 0 → 위치, location 1 → 색상
stride, offset으로 분리된 구조 처리 가능함
설정 후 glEnableVertexAttribArray()로 활성화함

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void)0); // 위치
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(float), (void)(3*sizeof(float))); // 색상

Shader (가볍게)

vertex shader → 정점 위치 처리함
fragment shader → 픽셀 색상 결정함
glCreateShader(), glShaderSource(), glCompileShader()로 생성 가능
glAttachShader(), glLinkProgram()으로 프로그램 연결함

while (!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(shaderProgram);
    glBindVertexArray(VAO[0]);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glUseProgram(shaderProgram2);
    glBindVertexArray(VAO[1]);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glfwSwapBuffers(window);
    glfwPollEvents();

}

정리 및 해제

glDeleteBuffers(), glDeleteVertexArrays()로 메모리 해제 가능
glDeleteProgram()으로 셰이더 프로그램 삭제 가능