QOpenGLContext Class

QOpenGLContext 클래스는 네이티브 OpenGL 컨텍스트를 나타내며, QSurface.. . 더 보기....

헤더: #include <QOpenGLContext>
CMake: find_package(Qt6 REQUIRED COMPONENTS Gui)
target_link_libraries(mytarget PRIVATE Qt6::Gui)
qmake: QT += gui
상속합니다: QObject

공용 유형

enum OpenGLModuleType { LibGL, LibGLES }

공용 함수

QOpenGLContext(QObject *parent = nullptr)
virtual ~QOpenGLContext()
bool create()
GLuint defaultFramebufferObject() const
void doneCurrent()
QSet<QByteArray> extensions() const
QOpenGLExtraFunctions *extraFunctions() const
QSurfaceFormat format() const
QOpenGLFunctions *functions() const
QFunctionPointer getProcAddress(const QByteArray &procName) const
QFunctionPointer getProcAddress(const char *procName) const
bool hasExtension(const QByteArray &extension) const
bool isOpenGLES() const
bool isValid() const
bool makeCurrent(QSurface *surface)
QNativeInterface *nativeInterface() const
QScreen *screen() const
void setFormat(const QSurfaceFormat &format)
void setScreen(QScreen *screen)
void setShareContext(QOpenGLContext *shareContext)
QOpenGLContext *shareContext() const
QOpenGLContextGroup *shareGroup() const
QSurface *surface() const
void swapBuffers(QSurface *surface)

Signals

정적 공용 멤버

bool areSharing(QOpenGLContext *first, QOpenGLContext *second)
QOpenGLContext *currentContext()
QOpenGLContext *globalShareContext()
QOpenGLContext::OpenGLModuleType openGLModuleType()
bool supportsThreadedOpenGL()

상세 설명

QOpenGLContext는 하부 OpenGL 컨텍스트의 OpenGL 상태를 나타냅니다. 컨텍스트를 설정하려면 컨텍스트를 사용하려는 서페이스와 일치하도록 화면과 형식을 설정하고, 필요한 경우 setShareContext()를 사용하여 다른 컨텍스트와 리소스를 공유하도록 한 다음 마지막으로 create()를 호출합니다. 반환값 또는 isValid()를 사용하여 컨텍스트가 성공적으로 초기화되었는지 확인합니다.

makeCurrent()를 호출하여 주어진 서페이스에 대해 컨텍스트를 최신 상태로 만들 수 있습니다. OpenGL 렌더링이 완료되면 swapBuffers()를 호출하여 서페이스의 앞뒤 버퍼를 교체하여 새로 렌더링된 콘텐츠가 표시되도록 합니다. 특정 플랫폼을 지원하려면 새 프레임 렌더링을 시작하기 전에 swapBuffers()을 호출한 후 makeCurrent()를 다시 호출해야 QOpenGLContext가 작동합니다.

애플리케이션이 렌더링되지 않을 때와 같이 컨텍스트가 일시적으로 필요하지 않은 경우 리소스를 확보하기 위해 컨텍스트를 삭제하는 것이 유용할 수 있습니다. aboutToBeDestroyed () 신호에 연결하여 QOpenGLContext 자체와 다른 소유권으로 할당된 모든 리소스를 정리할 수 있습니다.

QOpenGLContext가 최신 상태가 되면 QOpenGLFunctions, QOpenGLBuffer, QOpenGLShaderProgram, QOpenGLFramebufferObject 와 같은 Qt의 OpenGL 인에이블러를 사용하여 플랫폼에 독립적인 방식으로 렌더링할 수 있습니다. Qt 인에이블러를 사용하지 않고 플랫폼의 OpenGL API를 직접 사용하는 것도 가능하지만 이식성의 대가를 치를 수 있습니다. 후자는 OpenGL 1.x 또는 OpenGL ES 1.x를 사용하고자 할 때 필요합니다.

OpenGL API에 대한 자세한 내용은 공식 OpenGL 설명서를 참조하세요.

QOpenGLContext를 사용하는 방법에 대한 예는 OpenGL 창 예제를 참조하세요.

스레드 선호도

QOpenGLContext는 moveToThread()를 사용하여 다른 스레드로 이동할 수 있습니다. QOpenGLContext 객체가 속한 스레드가 아닌 다른 스레드에서 makeCurrent()를 호출하지 마세요. 컨텍스트는 한 번에 하나의 스레드에서 하나의 서페이스에 대해서만 현재 상태일 수 있으며, 스레드는 한 번에 하나의 컨텍스트만 현재 상태일 수 있습니다.

컨텍스트 리소스 공유

텍스처 및 버텍스 버퍼 오브젝트와 같은 리소스는 컨텍스트 간에 공유할 수 있습니다. create ()을 호출하기 전에 setShareContext()를 사용하여 컨텍스트가 이러한 리소스를 공유하도록 지정합니다. QOpenGLContext는 내부적으로 shareGroup()로 액세스할 수 있고 지정된 공유 그룹에 있는 모든 컨텍스트를 찾는 데 사용할 수 있는 QOpenGLContextGroup 객체를 추적합니다. 공유 그룹은 성공적으로 초기화되어 공유 그룹에 있는 기존 컨텍스트와 공유 중인 모든 컨텍스트로 구성됩니다. 공유하지 않는 컨텍스트에는 단일 컨텍스트로 구성된 공유 그룹이 있습니다.

기본 프레임버퍼

특정 플랫폼에서는 현재 서페이스에 따라 0이 아닌 다른 프레임버퍼가 기본 프레임 버퍼가 될 수 있습니다. 애플리케이션이 다른 플랫폼 간에 이식성을 갖도록 하려면 glBindFramebuffer(0)를 호출하는 대신 glBindFramebuffer(ctx->defaultFramebufferObject())를 사용하는 것이 좋습니다. 하지만 QOpenGLFunctions::glBindFramebuffer()를 사용하면 이 작업이 자동으로 수행됩니다.

경고: 웹 어셈블리

QSurface 의 전체 수명 동안 하나의 QOpenGLContext만 QSurface 로 최신 상태로 유지하는 것이 좋습니다. 컨텍스트를 두 번 이상 사용하는 경우, WebAssembly 플랫폼에서 여러 QOpenGLContext 인스턴스가 동일한 네이티브 컨텍스트 아래에 지원될 수 있다는 점을 이해하는 것이 중요합니다. 따라서 두 개의 QOpenGLContext 객체에서 동일한 QSurface 으로 makeCurrent()를 호출해도 두 번째 호출에서는 다른 네이티브 컨텍스트로 전환되지 않을 수 있습니다. 결과적으로 두 번째 makeCurrent() 이후에 수행되는 모든 OpenGL 상태 변경은 모두 동일한 네이티브 컨텍스트에 의해 뒷받침되므로 첫 번째 QOpenGLContext의 상태도 변경될 수 있습니다.

참고: 즉, 기존 Qt OpenGL 기반 코드로 WebAssembly를 타겟팅할 때 이러한 제한 사항을 충족하기 위해 일부 포팅이 필요할 수 있습니다.

QOpenGLFunctions, QOpenGLBuffer, QOpenGLShaderProgram, QOpenGLFramebufferObject참조하세요 .

멤버 유형 문서

enum QOpenGLContext::OpenGLModuleType

이 열거형은 기본 OpenGL 구현의 유형을 정의합니다.

Constant설명
QOpenGLContext::LibGL0OpenGL
QOpenGLContext::LibGLES1OpenGL ES 2.0 이상

멤버 함수 문서

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

부모 객체가 있는 새 OpenGL 컨텍스트 인스턴스를 만듭니다 parent.

사용하려면 먼저 적절한 형식을 설정하고 create()를 호출해야 합니다.

create() 및 makeCurrent()도 참조하세요 .

[virtual noexcept] QOpenGLContext::~QOpenGLContext()

QOpenGLContext 객체를 삭제합니다.

이것이 스레드의 현재 컨텍스트인 경우 doneCurrent()도 호출됩니다.

[signal] void QOpenGLContext::aboutToBeDestroyed()

이 신호는 기본 네이티브 OpenGL 컨텍스트가 파괴되기 전에 발생하므로 공유 OpenGL 컨텍스트의 경우 사용자가 매달린 채로 남아있을 수 있는 OpenGL 리소스를 정리할 수 있습니다.

정리를 위해 컨텍스트를 최신 상태로 유지하려면 직접 연결을 통해서만 신호에 연결해야 합니다.

참고: Qt for Python 에서는 파이썬 인스턴스가 이미 소멸되었기 때문에 QOpenGLWidget 또는 QOpenGLWindow 의 소멸자에서 이 신호를 수신할 수 없습니다. 대신 QWidget::hideEvent()에서 정리하는 것이 좋습니다.

[static] bool QOpenGLContext::areSharing(QOpenGLContext *first, QOpenGLContext *second)

firstsecond 컨텍스트가 OpenGL 리소스를 공유하는 경우 true 을 반환합니다.

bool QOpenGLContext::create()

현재 구성으로 OpenGL 컨텍스트를 만들려고 시도합니다.

현재 구성에는 형식, 공유 컨텍스트 및 화면이 포함됩니다.

시스템의 OpenGL 구현이 요청된 버전의 OpenGL 컨텍스트를 지원하지 않는 경우 QOpenGLContext 에서 가장 일치하는 버전을 만들려고 시도합니다. format () 함수에서 반환된 QSurfaceFormat 을 사용하여 실제로 생성된 컨텍스트 속성을 쿼리할 수 있습니다. 예를 들어 OpenGL 4.3 코어 프로파일을 지원하는 컨텍스트를 요청했지만 드라이버 및/또는 하드웨어가 버전 3.2 코어 프로파일 컨텍스트만 지원하는 경우 3.2 코어 프로파일 컨텍스트를 가져옵니다.

네이티브 컨텍스트가 성공적으로 생성되어 makeCurrent(), swapBuffers() 등과 함께 사용할 준비가 되면 true 을 반환합니다.

참고: 컨텍스트가 이미 존재하는 경우 이 함수는 기존 컨텍스트를 먼저 소멸한 다음 새 컨텍스트를 만듭니다.

makeCurrent() 및 format()도 참조하세요 .

[static] QOpenGLContext *QOpenGLContext::currentContext()

현재 스레드에서 makeCurrent 를 호출한 마지막 컨텍스트를 반환하거나, 현재 컨텍스트가 없는 경우 nullptr 를 반환합니다.

GLuint QOpenGLContext::defaultFramebufferObject() const

현재 표면의 기본 프레임버퍼 오브젝트를 가져오려면 이 함수를 호출합니다.

일부 플랫폼(예: iOS)에서는 기본 프레임버퍼 객체가 렌더링되는 표면에 따라 달라지며 0과 다를 수 있습니다. 따라서 애플리케이션이 다른 Qt 플랫폼에서 작동하도록 하려면 glBindFramebuffer(0)를 호출하는 대신 glBindFramebuffer(ctx->defaultFramebufferObject())를 호출해야 합니다.

QOpenGLFunctions 에서 glBindFramebuffer()를 사용하면 0이 전달되면 현재 컨텍스트의 defaultFramebufferObject()를 자동으로 바인딩하므로 이에 대해 걱정할 필요가 없습니다.

참고: QOpenGLWidgetQQuickWidget 과 같이 프레임버퍼 객체를 통해 렌더링하는 위젯은 페인팅이 활성화되면 이 함수에서 반환된 값을 재정의하는데, 이때 올바른 "기본" 프레임버퍼는 최상위 창 표면에 속한 플랫폼별 프레임버퍼가 아니라 위젯의 관련 지원 프레임버퍼이기 때문입니다. 이렇게 하면 이 함수와 이 함수에 의존하는 다른 클래스(예: QOpenGLFramebufferObject::bindDefault() 또는 QOpenGLFramebufferObject::release())에 대해 예상되는 동작이 보장됩니다.

QOpenGLFramebufferObject참조하세요 .

void QOpenGLContext::doneCurrent()

표면이 0인 makeCurrent 호출을 위한 편의 함수입니다.

이렇게 하면 현재 스레드에 현재 컨텍스트가 없습니다.

makeCurrent() 및 currentContext()도 참조하세요 .

QSet<QByteArray> QOpenGLContext::extensions() const

이 컨텍스트에서 지원되는 OpenGL 확장 집합을 반환합니다.

컨텍스트 또는 공유 컨텍스트는 최신 컨텍스트여야 합니다.

hasExtension()도 참조하세요 .

QOpenGLExtraFunctions *QOpenGLContext::extraFunctions() const

이 컨텍스트에 맞는 QOpenGLExtraFunctions 인스턴스를 가져옵니다.

QOpenGLContext 는 수동으로 관리할 필요 없이 QOpenGLExtraFunctions 에 액세스할 수 있는 편리한 방법으로 이를 제공합니다.

컨텍스트 또는 공유 컨텍스트는 최신 상태여야 합니다.

반환된 QOpenGLExtraFunctions 인스턴스는 사용할 준비가 되었으며 초기화OpenGLFunctions()를 호출할 필요가 없습니다.

참고: QOpenGLExtraFunctions 에는 런타임에 사용할 수 있는 기능이 보장되지 않는 기능이 포함되어 있습니다. 런타임 가용성은 플랫폼, 그래픽 드라이버 및 애플리케이션에서 요청한 OpenGL 버전에 따라 다릅니다.

QOpenGLFunctionsQOpenGLExtraFunctions참조하세요 .

QSurfaceFormat QOpenGLContext::format() const

create()가 호출된 경우 기본 플랫폼 컨텍스트의 형식을 반환합니다.

그렇지 않으면 요청된 형식을 반환합니다.

요청된 형식과 실제 형식은 다를 수 있습니다. 지정된 OpenGL 버전을 요청한다고 해서 결과 컨텍스트가 요청된 버전을 정확히 타겟팅한다는 의미는 아닙니다. 드라이버가 해당 컨텍스트를 제공할 수 있는 한, 생성된 컨텍스트의 버전/프로필/옵션 조합이 요청과 호환된다는 것만 보장됩니다.

예를 들어 OpenGL 버전 3.x 코어 프로파일 컨텍스트를 요청하면 OpenGL 4.x 코어 프로파일 컨텍스트가 생성될 수 있습니다. 마찬가지로 OpenGL 2.1을 요청하면 더 이상 사용되지 않는 기능이 활성화된 OpenGL 3.0 컨텍스트가 표시될 수 있습니다. 마지막으로 드라이버에 따라 지원되지 않는 버전은 컨텍스트 생성에 실패하거나 지원되는 최고 버전에 대한 컨텍스트가 생성될 수 있습니다.

버퍼 크기에서도 비슷한 차이가 발생할 수 있는데, 예를 들어 결과 컨텍스트의 깊이 버퍼가 요청된 것보다 클 수 있습니다. 이는 지극히 정상적인 현상입니다.

setFormat()도 참조하세요 .

QOpenGLFunctions *QOpenGLContext::functions() const

이 컨텍스트에 맞는 QOpenGLFunctions 인스턴스를 가져옵니다.

QOpenGLContext 는 수동으로 관리할 필요 없이 QOpenGLFunctions 에 액세스할 수 있는 편리한 방법으로 이를 제공합니다.

컨텍스트 또는 공유 컨텍스트는 최신 상태여야 합니다.

반환된 QOpenGLFunctions 인스턴스는 사용할 준비가 되었으며 초기화OpenGLFunctions()를 호출할 필요가 없습니다.

QFunctionPointer QOpenGLContext::getProcAddress(const QByteArray &procName) const

다음에 의해 식별되는 OpenGL 확장 함수에 대한 함수 포인터를 확인합니다. procName

해당 함수를 찾을 수 없으면 nullptr 을 반환합니다.

QFunctionPointer QOpenGLContext::getProcAddress(const char *procName) const

과부하가 걸린 기능입니다.

[static] QOpenGLContext *QOpenGLContext::globalShareContext()

애플리케이션 전체에 공유된 OpenGL 컨텍스트가 있는 경우 반환합니다. 그렇지 않으면 nullptr 을 반환합니다.

QOpenGLWidget 또는 QQuickWidget 을 생성하거나 표시하기 전에 OpenGL 객체(버퍼, 텍스처 등)를 업로드해야 하는 경우에 유용합니다.

참고: QGuiApplication 객체를 생성하기 전에 QGuiApplicationQt::AA_ShareOpenGLContexts 플래그를 설정해야 하며, 그렇지 않으면 Qt XML이 전역 공유 컨텍스트를 생성하지 않을 수 있습니다.

경고: 이 함수가 반환하는 컨텍스트를 어떤 서페이스에서도 현재로 만들려고 시도하지 마십시오. 대신 전역 컨텍스트와 공유하는 새 컨텍스트를 만든 다음 새 컨텍스트를 최신 컨텍스트로 만들 수 있습니다.

Qt::AA_ShareOpenGLContexts, setShareContext() 및 makeCurrent()도 참조하세요 .

bool QOpenGLContext::hasExtension(const QByteArray &extension) const

extension이 OpenGL 컨텍스트가 지정된 OpenGL을 지원하는 경우 true, 그렇지 않으면 false 을 반환합니다.

컨텍스트 또는 공유 컨텍스트는 최신 컨텍스트여야 합니다.

extensions()도 참조하세요 .

bool QOpenGLContext::isOpenGLES() const

컨텍스트가 OpenGL ES 컨텍스트인 경우 true를 반환합니다.

컨텍스트가 아직 생성되지 않은 경우 결과는 setFormat()를 통해 설정된 요청된 형식을 기반으로 합니다.

create(), format() 및 setFormat()도 참조하세요 .

bool QOpenGLContext::isValid() const

이 컨텍스트가 유효한 경우, 즉 성공적으로 생성된 경우 반환합니다.

일부 플랫폼에서 이전에 성공적으로 생성된 컨텍스트에 대한 false 반환 값은 OpenGL 컨텍스트가 손실되었음을 나타냅니다.

애플리케이션에서 컨텍스트 손실 시나리오를 처리하는 일반적인 방법은 makeCurrent()가 실패하고 false 을 반환할 때마다 이 함수를 통해 확인하는 것입니다. 이 함수가 false 을 반환하면 create()을 호출하여 기본 네이티브 OpenGL 컨텍스트를 다시 생성하고 makeCurrent()을 다시 호출한 다음 모든 OpenGL 리소스를 다시 초기화합니다.

일부 플랫폼에서는 컨텍스트 손실 상황을 피할 수 없습니다. 그러나 다른 플랫폼에서는 컨텍스트 손실을 선택해야 할 수도 있습니다. QSurfaceFormat 에서 ResetNotification 을 활성화하면 기본 기본 OpenGL 컨텍스트에서 RESET_NOTIFICATION_STRATEGY_EXTLOSE_CONTEXT_ON_RESET_EXT 으로 설정할 수 있습니다. 그러면 QOpenGLContext 이 모든 makeCurrent() 에서 glGetGraphicsResetStatusEXT() 을 통해 상태를 모니터링합니다.

create()도 참조하세요 .

bool QOpenGLContext::makeCurrent(QSurface *surface)

주어진 surface 에 대해 현재 스레드의 컨텍스트를 최신으로 만듭니다. 성공하면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다. 후자는 표면이 노출되지 않았거나 애플리케이션이 일시 중단되는 등의 이유로 그래픽 하드웨어를 사용할 수 없는 경우 발생할 수 있습니다.

surfacenullptr 인 경우 doneCurrent()를 호출하는 것과 같습니다.

QOpenGLContext 인스턴스가 있는 스레드가 아닌 다른 스레드에서 이 함수를 호출하지 마세요. 다른 스레드에서 QOpenGLContext 을 사용하려면 먼저 필요한 경우 doneCurrent()을 호출하여 현재 스레드에서 최신 스레드가 아닌지 확인해야 합니다. 그런 다음 다른 스레드에서 사용하기 전에 moveToThread(otherThread)를 호출합니다.

기본적으로 Qt는 스레드 선호도에 대해 위의 조건을 적용하는 검사를 사용합니다. Qt::AA_DontCheckOpenGLContextThreadAffinity 응용 프로그램 속성을 설정하여 이 검사를 비활성화할 수 있습니다. QObject thread affinity 문서에 설명된 대로 QObject가 있는 스레드 외부에서 사용할 경우의 결과를 이해해야 합니다.

functions(), doneCurrent() 및 Qt::AA_DontCheckOpenGLContextThreadAffinity참조하세요 .

template <typename QNativeInterface> QNativeInterface *QOpenGLContext::nativeInterface() const

컨텍스트에 대해 지정된 유형의 네이티브 인터페이스를 반환합니다.

이 함수는 QNativeInterface 네임스페이스에 정의된 QOpenGLContext 의 플랫폼별 기능에 대한 액세스를 제공합니다:

QNativeInterface::QCocoaGLContext

macOS에서 NSOpenGLContext에 대한 네이티브 인터페이스

QNativeInterface::QEGLContext

EGL 컨텍스트에 대한 네이티브 인터페이스

QNativeInterface::QGLXContext

GLX 컨텍스트에 대한 네이티브 인터페이스

QNativeInterface::QWGLContext

Windows에서 WGL 컨텍스트에 대한 네이티브 인터페이스

요청된 인터페이스를 사용할 수 없는 경우 nullptr 이 반환됩니다.

[static] QOpenGLContext::OpenGLModuleType QOpenGLContext::openGLModuleType()

기본 OpenGL 구현 유형을 반환합니다.

OpenGL 구현이 동적으로 로드되지 않는 플랫폼에서 반환 값은 컴파일 중에 결정되며 절대 변경되지 않습니다.

참고: 데스크톱 OpenGL 구현은 ES 호환 컨텍스트도 만들 수 있습니다. 따라서 대부분의 경우 QSurfaceFormat::renderableType()를 확인하거나 편의 함수 isOpenGLES()를 사용하는 것이 더 적절합니다.

참고: 이 함수를 사용하려면 QGuiApplication 인스턴스가 이미 생성되어 있어야 합니다.

QScreen *QOpenGLContext::screen() const

컨텍스트가 생성된 화면을 반환합니다.

setScreen()도 참조하세요 .

void QOpenGLContext::setFormat(const QSurfaceFormat &format)

OpenGL 컨텍스트가 호환되어야 하는 format 을 설정합니다. create ()를 호출해야 적용됩니다.

이 함수를 통해 형식을 명시적으로 설정하지 않으면 QSurfaceFormat::defaultFormat()에서 반환된 형식이 사용됩니다. 즉, 여러 컨텍스트가 있는 경우 첫 번째 컨텍스트를 만들기 전에 이 함수에 대한 개별 호출을 QSurfaceFormat::setDefaultFormat() 호출 한 번으로 대체할 수 있습니다.

format()도 참조하세요 .

void QOpenGLContext::setScreen(QScreen *screen)

OpenGL 컨텍스트가 유효해야 하는 screen 을 설정합니다. 적용하려면 create()를 호출해야 합니다.

screen()도 참조하세요 .

void QOpenGLContext::setShareContext(QOpenGLContext *shareContext)

이 컨텍스트가 텍스처, 셰이더 및 기타 OpenGL 리소스를 shareContext 와 공유하도록 합니다. 적용하려면 create()를 호출해야 합니다.

shareContext()도 참조하세요 .

QOpenGLContext *QOpenGLContext::shareContext() const

이 컨텍스트가 생성된 공유 컨텍스트를 반환합니다.

기본 플랫폼이 요청된 공유를 지원할 수 없는 경우 0을 반환합니다.

setShareContext()도 참조하세요 .

QOpenGLContextGroup *QOpenGLContext::shareGroup() const

이 컨텍스트가 속한 공유 그룹을 반환합니다.

[static] bool QOpenGLContext::supportsThreadedOpenGL()

플랫폼이 메인(GUI) 스레드 외부에서 OpenGL 렌더링을 지원하는 경우 true 을 반환합니다.

이 값은 사용 중인 플랫폼 플러그인에 의해 제어되며 그래픽 드라이버에 따라 달라질 수도 있습니다.

QSurface *QOpenGLContext::surface() const

컨텍스트가 현재로 설정된 서페이스를 반환합니다.

makeCurrent()에 인수로 전달된 서페이스입니다.

void QOpenGLContext::swapBuffers(QSurface *surface)

surface 의 뒤쪽과 앞쪽 버퍼를 바꿉니다.

이를 호출하여 OpenGL 렌더링의 한 프레임을 완료하고, 새 프레임의 일부와 같이 추가 OpenGL 명령을 실행하기 전에 makeCurrent()를 다시 호출해야 합니다.

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