이 페이지에서

QOpenGLVertexArrayObject Class

QOpenGLVertexArrayObject 클래스는 OpenGL Vertex Array Object를 래핑합니다. 더 보기...

헤더: #include <QOpenGLVertexArrayObject>
CMake: find_package(Qt6 REQUIRED COMPONENTS OpenGL)
target_link_libraries(mytarget PRIVATE Qt6::OpenGL)
qmake: QT += opengl
상속: QObject

공개 유형

class Binder

공개 함수

QOpenGLVertexArrayObject(QObject *parent = nullptr)
virtual ~QOpenGLVertexArrayObject()
void bind()
bool create()
void destroy()
bool isCreated() const
GLuint objectId() const
void release()

상세 설명

버텍스 배열 객체(VAO)는 OpenGL 파이프라인에 버텍스별 속성 데이터를 지정하는 데 필요한 상태를 캡슐화하는 OpenGL 컨테이너 객체입니다. 다시 말해, VAO는 버퍼 객체( QOpenGLBuffer 참조)의 상태와 관련 상태(예: 버텍스 속성 제수)를 기억합니다. 이를 통해 씬에서 서로 다른 “오브젝트”를 렌더링하기 위해 OpenGL 버퍼 상태를 매우 쉽고 효율적으로 전환할 수 있습니다. QOpenGLVertexArrayObject 클래스는 OpenGL VAO를 감싸는 얇은 래퍼입니다.

데스크톱 환경의 경우, VAO는 OpenGL 3.0 이상에서는 핵심 기능으로 지원되며, 이전 버전에서는 GL_ARB_vertex_array_object를 통해 지원됩니다. OpenGL ES 2에서는 선택적 GL_OES_vertex_array_object 확장을 통해 VAO가 제공됩니다. QOpenGLContext::surfaceFormat()을 사용하여 OpenGL 버전을 확인하고, QOpenGLContext::hasExtension()을 사용하여 확장 기능의 존재 여부를 확인할 수 있습니다.

다른 Qt OpenGL 클래스와 마찬가지로, QOpenGLVertexArrayObject에는 기본이 되는 OpenGL 객체를 생성하는 ` create()` 함수가 있습니다. 이는 개발자가 해당 시점에 유효한 OpenGL 컨텍스트가 존재하는지 확인할 수 있도록 하기 위함입니다.

VAO를 성공적으로 생성한 후의 일반적인 사용 패턴은 다음과 같습니다:

  • 씬 초기화 함수에서, 각 비주얼 객체에 대해:
    • VAO 바인딩
    • 해당 비주얼 오브젝트에 대한 버텍스 데이터 상태(버텍스, 노멀, 텍스처 좌표 등) 설정
    • VAO의 바인딩 해제(release()))
  • 렌더 함수에서 각 시각 객체에 대해:
    • VAO(및 필요한 경우 셰이더 프로그램)를 바인딩합니다
    • glDraw*() 함수를 호출합니다
    • VAO의 바인딩 해제 (release())

렌더 함수에서 VAO를 바인딩하는 작업은 초기화 단계에서 설정된 모든 정점 데이터 상태를 복원하는 효과를 가져옵니다. 이러한 방식으로 VAO를 설정할 때 많은 양의 상태를 설정할 수 있으며, 렌더링할 오브젝트의 상태 세트 간에 효율적으로 전환할 수 있습니다. 또한 VAO를 사용하면 OpenGL 드라이버가 정점 데이터에 대한 유효성 검사를 분산 처리할 수 있습니다.

참고: 다른 모든 OpenGL 컨테이너 객체와 마찬가지로,버텍스 배열 객체(VAO)는 생성된 컨텍스트에 고유하며 컨텍스트 그룹 내에서 공유할 수 없습니다.

QOpenGLVertexArrayObject::Binder 및 QOpenGLBuffer도 참조하십시오 .

멤버 함수 문서

[explicit] QOpenGLVertexArrayObject::QOpenGLVertexArrayObject(QObject *parent = nullptr)

지정된 ` parent`을 사용하여 `QOpenGLVertexArrayObject`를 생성합니다. 사용하기 전에 유효한 OpenGL 컨텍스트를 사용하여 ` create()`를 호출해야 합니다.

[virtual noexcept] QOpenGLVertexArrayObject::~QOpenGLVertexArrayObject()

QOpenGLVertexArrayObject 와 그 기반이 되는 OpenGL 리소스를 삭제합니다.

void QOpenGLVertexArrayObject::bind()

이 정점 배열 객체를 OpenGL 바인딩 지점에 바인딩합니다. 이 시점부터 release()이 호출되거나 다른 정점 배열 객체가 바인딩될 때까지, 정점 데이터 상태에 가해진 모든 변경 사항은 이 정점 배열 객체 내에 저장됩니다.

이후 다른 정점 배열 객체가 바인딩되더라도, 나중에 이 객체에 대해 다시 한 번 bind()를 호출하면 이 객체와 연관된 상태 집합을 복원할 수 있습니다. 이를 통해 렌더링 함수 내에서 정점 데이터 상태를 효율적으로 전환할 수 있습니다.

bool QOpenGLVertexArrayObject::create()

기본이 되는 OpenGL 정점 배열 객체를 생성합니다. 이 함수가 성공적으로 실행되려면 정점 배열 객체를 지원하는 유효한 OpenGL 컨텍스트가 현재 활성화되어 있어야 합니다.

OpenGL 정점 배열 객체가 성공적으로 생성된 경우 ` true `를 반환합니다.

반환 값이 ` false`인 경우, 정점 배열 객체 지원이 불가능합니다. 이는 오류가 아닙니다. OpenGL 2.x 또는 OpenGL ES 2.0을 사용하는 시스템에서는 정점 배열 객체가 지원되지 않을 수 있습니다. 이 경우 응용 프로그램은 실행을 계속할 수 있지만, VAO가 없는 환경에서도 작동할 수 있도록 준비해야 합니다. 즉, 단순히 ` bind()`를 호출하는 대신 ` isCreated()`의 값을 확인해야 하며, 버텍스 배열 객체가 없는 경우에는 전통적인 방식으로 버텍스 배열을 초기화해야 합니다.

isCreated()도 참조하십시오 .

void QOpenGLVertexArrayObject::destroy()

기본이 되는 OpenGL 정점 배열 객체를 삭제합니다. 이 함수가 성공적으로 실행되려면, 정점 배열 객체를 지원하는 유효한 OpenGL 컨텍스트가 현재 활성화되어 있어야 합니다.

bool QOpenGLVertexArrayObject::isCreated() const

true 를 반환하면, 기본이 되는 OpenGL 정점 배열 객체가 생성된 것입니다. 이 함수가 true 를 반환하고 관련 OpenGL 컨텍스트가 현재 활성화된 상태라면, 이 객체에 대해 bind()를 호출할 수 있습니다.

GLuint QOpenGLVertexArrayObject::objectId() const

기본이 되는 OpenGL 정점 배열 객체의 ID를 반환합니다.

void QOpenGLVertexArrayObject::release()

기본 정점 배열 객체(ID = 0)를 바인딩하여 이 정점 배열 객체의 바인딩을 해제합니다.

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.