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에 의존합니다.
정점 속성 관련 함수
- glEnableVertexAttribArray(index)
→ 정점 속성을 활성화하고, VAO에 저장. - glDisableVertexAttribArray(index)
→ 정점 속성을 비활성화하고, VAO에 저장. - glVertexAttribPointer(index, size, type, normalized, stride, pointer)
→ 정점 속성 데이터를 정의하며, VAO에 저장.
→ 호출 당시 바인딩된 VBO(GL_ARRAY_BUFFER)도 VAO에 저장됨. - 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 |
---|