이 페이지에서

QOpenGLWindow Class

QOpenGLWindow 클래스는 OpenGL 렌더링을 수행하기 위한 QWindow 의 편의 서브클래스입니다. 더 보기...

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

공개 유형

enum UpdateBehavior { NoPartialUpdate, PartialUpdateBlit, PartialUpdateBlend }

공개 함수

QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)
virtual ~QOpenGLWindow()
QOpenGLContext *context() const
GLuint defaultFramebufferObject() const
void doneCurrent()
QImage grabFramebuffer()
bool isValid() const
void makeCurrent()
QOpenGLContext *shareContext() const
QOpenGLWindow::UpdateBehavior updateBehavior() const

신호

void frameSwapped()

보호된 함수

virtual void initializeGL()
virtual void paintGL()
virtual void paintOverGL()
virtual void paintUnderGL()
virtual void resizeGL(int w, int h)

재구현된 보호 함수

virtual void paintEvent(QPaintEvent *event) override
virtual void resizeEvent(QResizeEvent *event) override

상세 설명

QOpenGLWindow는 QWindow 를 확장한 것으로, QOpenGLWidget 와 호환되는 API를 사용하여 OpenGL 렌더링을 수행하는 창을 쉽게 생성할 수 있게 해줍니다. QOpenGLWidget 와 달리, QOpenGLWindow는 위젯 모듈에 의존하지 않으며 더 나은 성능을 제공합니다.

일반적인 애플리케이션은 QOpenGLWindow를 서브클래스로 상속받아 다음 가상 함수들을 재구현합니다:

  • initializeGL()을 재정의하여 OpenGL 리소스 초기화를 수행하고
  • resizeGL()는 변환 행렬 및 기타 창 크기에 의존하는 리소스를 설정합니다
  • paintGL()는 OpenGL 명령을 발행하거나 다음을 사용하여 그리기 QPainter

다시 그리기를 예약하려면 update() 함수를 호출하십시오. 이 호출이 즉시 paintGL() 호출로 이어지지는 않는다는 점에 유의하십시오. update()를 연속해서 여러 번 호출해도 동작에는 아무런 변화가 없습니다.

이 함수는 슬롯이므로 QChronoTimer::timeout() 신호에 연결하여 애니메이션을 수행할 수 있습니다. 그러나 최신 OpenGL 환경에서는 디스플레이의 수직 갱신 주기에 맞춰 동기화하는 것이 훨씬 더 나은 선택이라는 점에 유의하십시오. 스왑 간격에 대한 설명은 setSwapInterval()을 참조하십시오. 1 의 스왑 간격(대부분의 시스템에서 기본값)을 사용할 경우, 각 리페인트 후 QOpenGLWindow가 내부적으로 실행하는 swapBuffers() 호출은 vsync를 기다리며 차단됩니다. 즉, 스왑이 완료될 때마다 타이머에 의존하지 않고 update()를 호출하여 업데이트를 다시 예약할 수 있습니다.

컨텍스트에 대한 특정 구성을 요청하려면, 다른 ` QWindow`와 마찬가지로 ` setFormat()`를 사용하십시오. 이를 통해 특정 OpenGL 버전 및 프로필을 요청하거나, 깊이 버퍼와 스텐실 버퍼를 활성화하는 등의 작업을 수행할 수 있습니다.

참고: 기본 윈도우 시스템 인터페이스에서 깊이 및 스텐실 버퍼를 요청하는것은 애플리케이션의책임입니다 . 0이 아닌 깊이 버퍼 크기를 요청하지 않으면 깊이 버퍼를 사용할 수 있다는 보장이 없으며, 그 결과 깊이 테스트와 관련된 OpenGL 연산이 예상대로 작동하지 않을 수 있습니다.

일반적으로 사용되는 깊이 버퍼 및 스텐실 버퍼 크기 요청 값은 각각 24와 8입니다. 예를 들어, QOpenGLWindow의 서브클래스는 생성자에서 다음과 같이 처리할 수 있습니다:

QSurfaceFormat format;
format.setDepthBufferSize(24);
format.setStencilBufferSize(8);
setFormat(format);

QWindow 와 달리, QOpenGLWindow는 자체적으로 페인터를 열고 ` QPainter` 기반의 그리기 작업을 수행할 수 있습니다.

QOpenGLWindow는 여러 가지 업데이트 동작을 지원합니다. 기본값인 NoPartialUpdate 는 일반적인 OpenGL 기반의 QWindow 와 동일합니다. 반면, PartialUpdateBlit 및 PartialUpdateBlend 는 항상 별도의 전용 프레임버퍼 객체가 존재하는 QOpenGLWidget 의 작동 방식에 더 가깝습니다. 이러한 모드는 일부 성능을 희생하는 대신, 매 페인트 작업 시 더 작은 영역만 다시 그리게 하고 나머지 콘텐츠는 이전 프레임에서 그대로 보존할 수 있게 해줍니다. 이는 QPainter 를 사용하여 점진적으로 렌더링하는 애플리케이션에 유용합니다. 왜냐하면 이 방식을 사용하면 paintGL() 호출 시마다 창 전체 콘텐츠를 다시 그릴 필요가 없기 때문입니다.

QOpenGLWidget 와 마찬가지로, QOpenGLWindow는 Qt::AA_ShareOpenGLContexts 속성을 지원합니다. 이 속성이 활성화되면 모든 QOpenGLWindow 인스턴스의 OpenGL 컨텍스트가 서로 공유됩니다. 이를 통해 각 인스턴스는 서로의 공유 가능한 OpenGL 리소스에 접근할 수 있습니다.

Qt의 그래픽에 대한 자세한 내용은 Graphics를 참조하십시오.

멤버 유형 문서

enum QOpenGLWindow::UpdateBehavior

이 열거형은 QOpenGLWindow 의 업데이트 전략을 설명합니다.

상수값설명
QOpenGLWindow::NoPartialUpdate0매 업데이트 시 창 전체 영역이 다시 그려지므로 추가 프레임버퍼가 필요하지 않음을 나타냅니다. 이 설정은 대부분의 경우 사용되며, ` QWindow `를 통해 직접 그리는 방식과 동일하게 작동합니다.
QOpenGLWindow::PartialUpdateBlit1paintGL()에서 수행되는 그리기가 창 전체를 덮지 않음을 나타냅니다. 이 경우 내부적으로 추가 프레임버퍼 객체가 생성되며, paintGL()에서 수행되는 렌더링은 이 프레임버퍼를 대상으로 합니다. 그런 다음 이 프레임버퍼는 매 페인트 후 창 표면의 기본 프레임버퍼로 블릿됩니다. 이를 통해 paintGL() 내에서 QPainter 기반의 그리기 코드를 사용할 수 있으며, NoPartialUpdate와 달리 이전 내용이 보존되므로 한 번에 더 작은 영역만 다시 그리게 됩니다.
QOpenGLWindow::PartialUpdateBlend2PartialUpdateBlit와 유사하지만, 프레임버퍼 블릿을 사용하는 대신 블렌딩을 활성화한 텍스처가 적용된 사각형을 그려 추가 프레임버퍼의 내용을 렌더링합니다. 이는 PartialUpdateBlit와 달리 알파 블렌딩된 콘텐츠를 허용하며, glBlitFramebuffer를 사용할 수 없는 경우에도 작동합니다. 성능 면에서 이 설정은 PartialUpdateBlit보다 다소 느릴 가능성이 높습니다.

멤버 함수 문서

[explicit] QOpenGLWindow::QOpenGLWindow(QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)

지정된 ` parent ` 및 ` updateBehavior`을 사용하여 새로운 `QOpenGLWindow`를 생성합니다.

QOpenGLWindow::UpdateBehavior도 참조하십시오 .

[explicit] QOpenGLWindow::QOpenGLWindow(QOpenGLContext *shareContext, QOpenGLWindow::UpdateBehavior updateBehavior = NoPartialUpdate, QWindow *parent = nullptr)

지정된 ` parent ` 및 ` updateBehavior`을 사용하여 새로운 `QOpenGLWindow`를 생성합니다. 이 `QOpenGLWindow`의 컨텍스트는 ` shareContext`과 공유됩니다.

QOpenGLWindow::UpdateBehavior 및 shareContext도 참조하십시오 .

[virtual noexcept] QOpenGLWindow::~QOpenGLWindow()

QOpenGLWindow 인스턴스를 파기하고 해당 리소스를 해제합니다.

소멸자에서 OpenGLWindow의 컨텍스트가 현재 컨텍스트로 설정되므로, 이 창이 제공하는 컨텍스트에 속한 OpenGL 리소스를 해제해야 할 수 있는 모든 자식 객체를 안전하게 소멸시킬 수 있습니다.

경고: QOpenGLWindow 의 서브클래스 멤버로 OpenGL 리소스( QOpenGLBuffer, QOpenGLShaderProgram 등)를 래핑하는 객체가 있는경우 , 해당 서브클래스의 소멸자에서도 makeCurrent() 호출을 추가해야 할 수 있습니다. C++ 객체 소멸 규칙에 따라, 해당 객체들은 이 함수가 호출되기 전에 소멸되지만(그 후 하위 클래스의 소멸자가 실행된 후), 이로 인해 이 함수 내에서 OpenGL 컨텍스트를 현재 컨텍스트로 설정하는 작업은 해당 객체들을 안전하게 처리하기에는 너무 늦게 이루어집니다.

makeCurrent도 참조하십시오 .

QOpenGLContext *QOpenGLWindow::context() const

이 창에서 사용되는 ` QOpenGLContext `를 반환하며, 아직 초기화되지 않은 경우에는 ` 0 `를 반환합니다.

GLuint QOpenGLWindow::defaultFramebufferObject() const

이 창에서 사용하는 프레임버퍼 객체 핸들입니다.

업데이트 동작이 ` NoPartialUpdate`로 설정된 경우, 별도의 프레임버퍼 객체가 존재하지 않습니다. 이 경우 반환되는 값은 기본 프레임버퍼의 ID입니다.

그 외의 경우에는 프레임버퍼 객체의 ID 값이 반환되며, 아직 초기화되지 않은 경우에는 ` 0 `가 반환됩니다.

void QOpenGLWindow::doneCurrent()

컨텍스트를 해제합니다.

대부분의 경우 이 함수를 호출할 필요가 없습니다. 위젯이 ` paintGL()`를 호출할 때 컨텍스트가 올바르게 바인딩되고 해제되도록 보장하기 때문입니다.

makeCurrent()도 참조하십시오 .

[signal] void QOpenGLWindow::frameSwapped()

이 신호는 잠재적으로 차단 효과를 일으킬 수 있는 ` buffer swap `가 완료된 후에 발생합니다. 수직 갱신 주기와 동기화되어 지속적으로 화면을 다시 그리려는 애플리케이션은 이 신호가 발생하면 ` update()`를 호출해야 합니다. 이를 통해 기존의 타이머를 사용하는 방식에 비해 훨씬 더 부드러운 사용자 경험을 제공할 수 있습니다.

QImage QOpenGLWindow::grabFramebuffer()

프레임버퍼의 복사본을 반환합니다.

참고: 이 작업은 glReadPixels()를 사용하여 픽셀을 다시 읽어오기 때문에 처리 비용이 높을 수 있습니다. 이로 인해 속도가 느려지거나 GPU 파이프라인이 중단될 수 있습니다.

참고: 업데이트 동작 NoPartialUpdate 과 함께 사용할경우 , 프론트 버퍼와 백 버퍼가 스왑된 후에 이 함수를 호출하면 반환된 이미지에 원하는 내용이 포함되지 않을 수 있습니다(기본 윈도우 시스템 인터페이스에서 ‘preserved swap’이 활성화되어 있지 않은 경우). 이 모드에서 함수는 백 버퍼에서 데이터를 읽는데, 그 내용은 화면(프론트 버퍼)에 표시된 내용과 일치하지 않을 수 있습니다. 이 경우 이 함수를 안전하게 사용할 수 있는 유일한 위치는 ` paintGL()` 또는 ` paintOverGL()`입니다.

[virtual protected] void QOpenGLWindow::initializeGL()

이 가상 함수는 paintGL() 또는 resizeGL()이 처음 호출되기 전에 한 번 호출됩니다. 하위 클래스에서 이 함수를 재구현하십시오.

이 함수는 필요한 모든 OpenGL 리소스와 상태를 설정해야 합니다.

makeCurrent()을 호출할 필요는 없습니다. 이 함수가 호출될 때 이미 해당 작업이 완료되었기 때문입니다. 다만, 부분 업데이트 모드가 사용되는 경우 이 단계에서는 프레임버퍼를 아직 사용할 수 없으므로, 여기서 드로우 호출을 수행하지 마십시오. 대신 paintGL()에서 해당 호출을 수행하십시오.

paintGL() 및 resizeGL()도 참조하십시오 .

bool QOpenGLWindow::isValid() const

컨텍스트와 같은 창의 OpenGL 리소스가 성공적으로 초기화되면 ` true `를 반환합니다. 창이 노출(표시)되기 전까지는 반환 값이 항상 ` false `임을 유의하십시오.

void QOpenGLWindow::makeCurrent()

해당 컨텍스트를 현재 컨텍스트로 설정하고, 존재하는 경우 해당 컨텍스트에 프레임버퍼 객체를 바인딩하여 이 창에 대한 OpenGL 콘텐츠 렌더링을 준비합니다.

대부분의 경우 paintGL()를 호출하기 전에 이 함수가 자동으로 호출되므로, 별도로 호출할 필요는 없습니다. 다만, GUI 스레드나 메인 스레드 이외의 스레드가 서피스나 프레임버퍼 내용을 업데이트하고자 하는 고급 멀티스레드 시나리오를 지원하기 위해 이 함수가 제공됩니다. 스레딩 관련 문제에 대한 자세한 내용은 QOpenGLContext 을 참조하십시오.

이 함수는 기본 플랫폼 창이 이미 소멸된 경우에도 호출하기에 적합합니다. 즉, QOpenGLWindow 의 서브클래스 소멸자에서 이 함수를 호출해도 안전합니다. 네이티브 창이 더 이상 없는 경우, 대신 오프스크린 서페이스가 사용됩니다. 이를 통해 이 함수가 먼저 호출되는 한, 소멸자 내의 OpenGL 리소스 정리 작업이 항상 정상적으로 수행되도록 보장합니다.

QOpenGLContext, context(), paintGL(), doneCurrent()도 참조하십시오 .

[override virtual protected] void QOpenGLWindow::paintEvent(QPaintEvent *event)

QPaintDeviceWindow::paintEvent(QPaintEvent *event)를 재구현합니다.

event 핸들러를 그립니다. paintGL()를 호출합니다.

paintGL()도 참조하십시오 .

[virtual protected] void QOpenGLWindow::paintGL()

이 가상 함수는 창 내용을 그려야 할 때마다 호출됩니다. 하위 클래스에서 이 함수를 재정의하십시오.

makeCurrent()을 호출할 필요는 없습니다. 이 함수가 호출될 때 이미 해당 작업이 수행되었기 때문입니다.

이 함수를 호출하기 전에 컨텍스트와 프레임버퍼(있는 경우)가 바인딩되며, glViewport() 호출을 통해 뷰포트가 설정됩니다. 그 외의 상태는 설정되지 않으며, 프레임워크에 의해 지우기나 그리기 작업이 수행되지 않습니다.

참고: PartialUpdateBlend 와 같은 부분 업데이트 동작을 사용할경우 , 이전 paintGL() 호출의 출력 결과가 보존되며, 현재 함수 호출에서 수행된 추가 그리기 작업 후, 해당 콘텐츠는 paintUnderGL()에서 창에 직접 그려진 콘텐츠 위에 블릿(blit)되거나 블렌딩(blend)됩니다.

initializeGL(), resizeGL(), paintUnderGL(), paintOverGL() 및 UpdateBehavior도 참조하십시오 .

[virtual protected] void QOpenGLWindow::paintOverGL()

이 가상 함수는 ` paintGL()`이 호출될 때마다 호출됩니다.

업데이트 모드가 ` NoPartialUpdate`로 설정되어 있을 때, 이 함수와 ` paintGL()` 사이에는 차이가 없으며, 두 함수 중 어느 쪽에서 렌더링을 수행하더라도 동일한 결과가 나옵니다.

paintUnderGL()와 마찬가지로, 이 함수에서 렌더링은 업데이트 동작과 관계없이 창의 기본 프레임버퍼를 대상으로 합니다. 이 함수는 paintGL()가 반환되고 블릿(PartialUpdateBlit) 또는 쿼드 그리기(PartialUpdateBlend)가 완료된 후에 호출됩니다.

paintGL(), paintUnderGL(), UpdateBehavior도 참조하십시오 .

[virtual protected] void QOpenGLWindow::paintUnderGL()

paintGL()이 호출될 때마다 이 가상 함수가 호출됩니다.

업데이트 모드가 ` NoPartialUpdate`로 설정된 경우, 이 함수와 ` paintGL()` 간에는 차이가 없으며, 두 함수 중 어느 쪽에서 렌더링을 수행하더라도 동일한 결과가 나옵니다.

이 차이는 추가 프레임버퍼 객체가 사용되는 ` PartialUpdateBlend`을 사용할 때 두드러집니다. 이 경우, ` paintGL()`는 내용을 보존하는 이 추가 프레임버퍼 객체를 대상으로 하는 반면, `paintUnderGL()` 및 ` paintOverGL()`는 기본 프레임버퍼, 즉 창 표면을 직접 대상으로 하며, 이 프레임버퍼의 내용은 각 프레임이 표시된 후 사라집니다.

참고: 업데이트 동작이 ` PartialUpdateBlit`인 경우 이 함수에 의존하지마십시오 . 이 모드에서는 ` paintGL()`가 호출될 때마다 ` paintGL()`에서 사용된 추가 프레임버퍼의 내용을 기본 프레임버퍼로 블리팅하므로, 이 함수에서 생성된 모든 그리기 내용이 덮어쓰게 됩니다.

paintGL(), paintOverGL() 및 UpdateBehavior도 참조하십시오 .

[override virtual protected] void QOpenGLWindow::resizeEvent(QResizeEvent *event)

QWindow::resizeEvent(QResizeEvent *ev)를 재구현합니다.

event 핸들러의 크기 조정. resizeGL()를 호출합니다.

resizeGL()도 참조하십시오 .

[virtual protected] void QOpenGLWindow::resizeGL(int w, int h)

이 가상 함수는 위젯의 크기가 조정될 때마다 호출됩니다. 하위 클래스에서 이 함수를 재구현하십시오. 새로운 크기는 ` w ` 및 ` h`에 전달됩니다.

참고: 이 함수는 QOpenGLWidget 와 호환되는 API를 제공하기 위한 편의 함수에 불과합니다. QOpenGLWidget 와 달리, 파생 클래스는 이 함수 대신 resizeEvent()을 재정의할 수 있습니다.

참고: 이 함수가 호출될 때 현재 컨텍스트가 없을 수 있으므로, 이 함수 내에서 OpenGL 명령을 실행하지마십시오 . 부득이하게 실행해야 하는 경우, makeCurrent()를 호출하십시오.

참고: 이 함수에서 업데이트를예약할 필요는 없습니다. 윈도우 시스템이 업데이트를 자동으로 트리거하는 노출 이벤트를 전송합니다.

initializeGL() 및 paintGL()도 참조하십시오 .

QOpenGLContext *QOpenGLWindow::shareContext() const

이 창 QOpenGLContext 와 공유하도록 요청된 QOpenGLContext 를 반환합니다.

QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const

이 ` QOpenGLWindow`의 업데이트 동작을 반환합니다.

© 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.