2011-09-21 4 views
2

여러 OpenGL 컨텍스트 간의 목록 공유를 실험하고 있습니다. 병렬 렌더링 스레드를 실행할 수 있기 때문에 큰 특징입니다.다른 버전의 다중 컨텍스트

그러나 CreateContextAttribs를 사용하고 있기 때문에 특정 OpenGL 구현을 요청할 수있는 가능성을 제공합니다. 따라서 일부 컨텍스트에서는 버전 3.2 이상이 구현되고 다른 컨텍스트에서는 버전 2.1이 구현 될 수 있습니다.

실제로는 꽤 잘 작동하지만이 방법은 일부 부작용을 숨 깁니다. 서로 다른 버전의 컨텍스트를 사용할 때 발생할 수있는 문제 목록은 무엇입니까?

이외에도 각기 다른 버전이 다른 확장을 지원할 수 있기 때문에 각 컨텍스트 버전에 대해 구현 된 확장을 쿼리합니다. 맞습니까? 그리고 함수 포인터는 어떻습니까? 나는 각각의 컨텍스트에 대해 서로 다른 버전으로 재 쿼리해야한다 (실제로 버전에 따라 포인터가 바뀐다)?

답변

8

병렬 렌더링 스레드를 실행할 수 있기 때문에 큰 특징입니다.

병렬로 여러 스레드에서 GPU에 액세스하는 것은 심각한 성능 저하 요인입니다. 하지 마. GPU는 렌더링을 내부적으로 병렬 처리합니다. 당신이하는 일 외에는 바퀴에 통나무를 던지고 있습니다.

자산 업로드 속도를 높이려면 버퍼 객체와 비동기 액세스를 살펴보십시오. 그러나 동시에 다른 스레드에서 여러 OpenGL 컨텍스트를 수행하지 마십시오.


는하지만 CreateContextAttribs을 사용하고 있기 때문에, 나는 특정의 OpenGL 구현을 요청할 수있는 가능성을 제공합니다. 따라서 일부 컨텍스트에서는 버전 3.2 이상이 구현되고 다른 컨텍스트에서는 버전 2.1이 구현 될 수 있습니다.

실제로는 꽤 잘 작동하지만이 방법은 일부 부작용을 숨 깁니다. 서로 다른 버전의 컨텍스트를 사용할 때 발생할 수있는 문제 목록은 무엇입니까?

이것은 실제로 매우 좋은 질문입니다. 그리고 specification 답변 명확하게이 넘어

1) Can different GL context versions share data? 

    PROPOSED: Yes, with restrictions as defined by the supported feature 
    sets. For example, program and shader objects cannot be shared with 
    OpenGL 1.x contexts, which do not support them. 

    NOTE: When the new object model is introduced, sharing must be 
    established at creation time, since the object handle namespace is 
    also shared. wglShareLists would therefore fail if either context 
    parameter to it were to be a context supporting the new object 
    model. 

, 내가 다른 버전은 다른 확장을 지원할 수 있다고 가정하기 때문에,이 권리는, 각각의 상황에 맞는 버전에 구현 된 확장명을 쿼리?

실제로 각 컨텍스트에 대해 지원되는 확장 집합을 쿼리하는 것은 올바른 일입니다.

그리고 함수 포인터는 어떻습니까? 나는 각각의 컨텍스트에 대해 서로 다른 버전으로 재 쿼리해야한다 (실제로 버전에 따라 포인터가 바뀐다)?

On Windows 확장 기능 포인터는 컨텍스트에 연결됩니다.이 작업을 수행하는 제정신이 방법은 현재 만들어지고 상황 중 하나에 currentContextFunctions 포인터를 설정하는 몇 가지 도우미 함수 일부

typedef struct OpenGLExtFunctions_S { 
    GLvoid (*glFoobarEXT)(GLenum, ...); 
    /* OpenGL function pointers */ 
} OpenGLExtFunctions; 

/* currentContextFunction must be thread loacal since 
    contexts are active in one thread only */ 
__declspec(thread) OpenGLExtFunctions *currentContextFunctions; 

#define glFoobarEXT (currentContextFunctions->glFoobarEXT); 
#define ... 

그리고 포장 wglMakeCurrentwglMakeContextCurrent을 가지고있다. GLEW와 같은 확장자 랩퍼 라이브러리는이 모든 일을 당신을 위해 처리해 주므로 직접하지 않아도됩니다.

X11/GLX에서는 훨씬 더 간단합니다 : glXGetProcAddress에 의해 반환 된 함수 포인터는 모든 컨텍스트에서 동일해야하므로이를 전환 할 필요가 없습니다.

+0

비평가 들께 감사드립니다.하지만 별도의 스레드에서 셰이더 컴파일 및 텍스처 업로드가 실제로 "빠른"(즉, 실제 렌더링의 FPS에는 영향을주지 않음)을 수행한다는 사실을 발견했습니다. 그리고 ... 진짜 질문은 어떨까요? – Luca

+0

@ 루카 피치 오니 (Luca Piccioni) : 셰이더 편집 및 텍스처 업로드는 실제로 별도의 스레드에서 수행하는 것이 두 가지 일뿐입니다. 둘 다 실제로 GPU를 조절하지 않기 때문입니다. 셰이더는 CPU에 의해 컴파일되고 텍스처 업로드는 CPU 메모리의 버퍼에 먼저 업로드 된 다음 GPU 메모리로 업로드가 지연되는 두 배의 프로세스입니다. – datenwolf

+0

나는 이것을 실험했다. 내 질문은 다음과 같은 상황에서 온 것입니다 : 2.1 컨텍스트에 의해 생성 된 셰이더는 다른 버전을 가진 컨텍스트에 의해 실행될 수 있습니까? 다른 버전의 다른 컨텍스트에서 오는 다른 셰이더 객체를 혼합 할 수 있습니까? 이 경우를 제외하고, 질문은보다 일반적인 방식으로 게시되었습니다. – Luca

관련 문제