본문 바로가기
OpenGL Tip

VAO, VBO 사용시 주의점

by SimonLee 2024. 12. 12.

 

VBO를 사용하지 않는 경우라도 VBO 해제하지 않으면,

이전 VBO 연결 정보가 남아서 렌더링이 안된다.

VBO 언 바인드 잘하자 

// VBO를 사용하지 않으므로 바인드 해제
glBindBuffer(GL_ARRAY_BUFFER, 0);

// CPU 배열 참조
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, quad2);
glEnableVertexAttribArray(0);

// 도형 렌더링
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

 

VAO를 설정할 때 CPU 메모리 포인터를 사용하는 경우, VAO는 그 상태를 저장하지만,

실제 GPU의 데이터 참조가 손실될 가능성이 있습니다.

일부 드라이버에서는 VBO 없이 VAO를 사용하는 경우 정상적으로 동작하지 않을 수 있습니다.

반드시 VAO 사용하면 VBO도 사용하도록 하자!!

 

VAO에 의존하는 함수

VAO는 **정점 속성(Attribute)**과 관련된 상태를 저장합니다.

따라서, 정점 속성과 관련된 함수는 VAO에 의존합니다.

 

정점 속성 관련 함수

  1. glEnableVertexAttribArray(index)
    → 정점 속성을 활성화하고, VAO에 저장.
  2. glDisableVertexAttribArray(index)
    → 정점 속성을 비활성화하고, VAO에 저장.
  3. glVertexAttribPointer(index, size, type, normalized, stride, pointer)
    → 정점 속성 데이터를 정의하며, VAO에 저장.
    → 호출 당시 바인딩된 VBO(GL_ARRAY_BUFFER)도 VAO에 저장됨.
  4. glVertexAttribDivisor(index, divisor)
    → 인스턴싱 속성의 divisor 설정도 VAO에 저장.

정점 배열 관련 함수

  • glBindBuffer(GL_ARRAY_BUFFER, buffer)
    → glVertexAttribPointer 호출과 함께 사용될 때, VAO에 저장됨.

정점 배열 객체 관련 함수

  • glBindVertexArray(VAO)
    → VAO를 활성화하며, 이후 호출되는 VAO 의존 함수가 이 VAO에 영향을 미침.

 

VAO에 의존하지 않는 함수

VAO와는 무관하게 동작하며, 다른 OpenGL 상태나 객체와 관련된 함수들입니다.

 

버퍼 생성 및 데이터 업로드

  • glGenBuffers(n, buffers)
    → 버퍼를 생성하는 함수로, VAO에 저장되지 않음.
  • glBindBuffer(target, buffer)
    → VBO, EBO 등 버퍼를 특정 대상(GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER)에 바인딩.
    단, GL_ARRAY_BUFFER는 glVertexAttribPointer와 함께 호출될 때만 VAO와 연관됨.
    GL_ELEMENT_ARRAY_BUFFER는 VAO와 항상 연관됨.
  • glBufferData(target, size, data, usage)
    → 버퍼 데이터를 업로드하는 함수로, VAO와 무관.

셰이더 및 텍스처 관련 함수

  • glCreateShader, glShaderSource, glCompileShader
    → 셰이더 생성 및 컴파일.
  • glCreateProgram, glLinkProgram, glUseProgram
    → 셰이더 프로그램 생성 및 활성화.
  • glGenTextures, glBindTexture, glTexImage2D
    → 텍스처 관련 함수로, VAO와 연관 없음.

렌더링 관련 함수

  • glDrawArrays(mode, first, count)
    → 정점 배열을 그리는 함수로, 활성화된 VAO의 상태에 따라 동작하지만, 자체적으로 VAO를 변경하지 않음.
  • glDrawElements(mode, count, type, indices)
    → 요소 배열(EBO)을 사용하는 렌더링.
    → 단, EBO는 VAO에 저장되므로 바인딩된 VAO가 영향을 미침.

프레임 버퍼 및 상태 설정

  • glClear, glClearColor, glViewport
    → 화면 초기화 및 뷰포트 설정 함수로, VAO와 무관.
  • glEnable, glDisable
    → OpenGL의 전역 상태 변경.

'OpenGL Tip' 카테고리의 다른 글

GL_TRIANGLE_STRIP vs GL_TRIANGLE_FAN  (0) 2024.12.21