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는 QOpenGLWidget 와 호환되는 API를 사용하여 OpenGL 렌더링을 수행하는 창을 쉽게 만들 수 있는 향상된 QWindow 입니다. 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 과 동일합니다. 반면 PartialUpdateBlitPartialUpdateBlend 은 항상 별도의 전용 프레임버퍼 객체가 존재하는 QOpenGLWidget 의 작업 방식에 더 부합합니다. 이러한 모드에서는 약간의 성능을 희생하여 각 페인트에서 더 작은 영역만 다시 그리고 나머지 콘텐츠는 이전 프레임에서 보존할 수 있습니다. 이 모드는 paintGL() 호출할 때마다 전체 창 콘텐츠를 다시 그릴 필요가 없으므로 QPainter 을 사용하여 점진적으로 렌더링하는 것보다 애플리케이션에 유용합니다.

QOpenGLWidget 와 유사하게 QOpenGLWindow는 Qt::AA_ShareOpenGLContexts 어트리뷰트를 지원합니다. 이 속성을 활성화하면 모든 QOpenGLWindow 인스턴스의 OpenGL 컨텍스트가 서로 공유됩니다. 이를 통해 서로의 공유 가능한 OpenGL 리소스에 액세스할 수 있습니다.

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

멤버 유형 문서

enum QOpenGLWindow::UpdateBehavior

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

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

멤버 함수 문서

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

주어진 parentupdateBehavior 로 새 QOpenGLWindow 를 만듭니다.

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

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

주어진 parentupdateBehavior 로 새로운 QOpenGLWindow 를 구축합니다. QOpenGLWindow 의 컨텍스트는 shareContext 와 공유됩니다.

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

[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 과 함께 사용할 경우 앞뒤 버퍼가 스왑된 후에 호출하면 반환된 이미지에 원하는 콘텐츠가 포함되지 않을 수 있습니다(기본 창 시스템 인터페이스에서 보존된 스왑이 활성화되어 있지 않은 경우). 이 모드에서는 함수가 백 버퍼에서 읽으며 그 내용이 화면의 콘텐츠(프론트 버퍼)와 일치하지 않을 수 있습니다. 이 경우 이 기능을 안전하게 사용할 수 있는 유일한 곳은 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 핸들러를 페인트합니다. paintGL ()를 호출합니다.

paintGL()도 참조하십시오 .

[virtual protected] void QOpenGLWindow::paintGL()

이 가상 함수는 창 내용을 칠해야 할 때마다 호출됩니다. 서브클래스에서 다시 구현하세요.

이 함수가 호출될 때 이미 작업이 완료되었으므로 makeCurrent()를 호출할 필요가 없습니다.

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

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

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)

이 가상 함수는 위젯의 크기가 조정될 때마다 호출됩니다. 서브클래스에서 다시 구현하세요. 새 크기는 wh 에 전달됩니다.

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

참고: 이 함수를 호출할 때 현재 컨텍스트가 없을 수 있으므로 이 함수에서 OpenGL 명령을 실행하지 마세요. 피할 수 없는 경우에는 makeCurrent()를 호출하세요.

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

initializeGL() 및 paintGL()도 참조하세요 .

QOpenGLContext *QOpenGLWindow::shareContext() const

이 창에서 공유 요청된 QOpenGLContextQOpenGLContext 으로 반환합니다.

QOpenGLWindow::UpdateBehavior QOpenGLWindow::updateBehavior() const

QOpenGLWindow 에 대한 업데이트 동작을 반환합니다.

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