2016-08-06 5 views
1

OpenGL/Windows 10/Visual C++ 사용 2015OpenGL 확장 포인터를 전역으로 만들 수 있습니까?

내 프로그램에는 '현대'OpenGL 컨텍스트를 만드는 등의 Win32 화면 창이 생성되고 유지되는 'Window'클래스가 있습니다. 이 일의 일환으로 그것은 많은 OpenGL '확장'기능에 대한 포인터를 얻습니다.

내 질문에 그 확장 포인터를 전역/클래스를 정적으로 저장할 수 있습니까? 아니면 다른 인스턴스 나 창마다 다른 OpenGL 컨텍스트를 가질 수 있도록 복사본을 유지해야합니까? 내가 만든 모든 OpenGL 컨텍스트에 대해 포인터가 유효하고 동일합니까? 아니면 내가 만든 모든 창에 대해 포인터를 반복해서해야합니까?

+1

수동으로 gl 확장을로드하는 이유는 무엇입니까? – ampawd

+1

@ampawd : GL 확장은 수동으로로드해야하기 때문에. 확장 로더를 사용하거나 직접 모든 작업을 수행하십시오. – datenwolf

+1

@datenwolf 예,로드해야합니다. 수동으로 처리하는 것은 시간 낭비입니다. 단순히 gl API를 사용하는 클라이언트 응용 프로그램이라면 glew 또는 다른 로더를 사용하여 확장을로드하는 것이 중요합니다. – ampawd

답변

4

내가 만든 모든 OpenGL 컨텍스트에 대해 포인터가 유효하고 동일한 지 또는 내가 만든 모든 창에 대해 포인터를 반복해서해야합니까?

사용되는 운영 체제 및 윈도우 시스템에 따라 다릅니다. WGL specification says는 OpenGL은 확장 함수 포인터가 각각의 OpenGL 컨텍스트 다른 것이 허용된다는 :

wglGetProcAddress() ...

설명

는 OpenGL 라이브러리는 다수의 구현을 지원 그 기능의. 하나의 렌더링 컨텍스트에서 지원되는 확장 함수가 별도의 렌더링 컨텍스트에서 반드시 사용 가능하지 않습니다. 따라서 응용 프로그램에서 주어진 렌더링 컨텍스트 의 경우 wglGetProcAddress 함수에 의해서만 리턴 된 함수 주소를 사용하십시오. OpenGL은 확장 함수 포인터 (즉, 변하지 않음) 불변임을 X11/GLX specifies (page 35, section 3.3.12) 달리

없이 컨텍스트 : glXGetProcAddress 의해 반환

GL 함수 포인터가 현재 결합 문맥 무관하며 확장을 지원하는 모든 컨텍스트에서 사용할 수 있습니다. 윈도우의 경우

가장 유력한 방법은 컨텍스트 핸들 모든 함수 포인터를 들고 구조 사이에지도를하는 것, 즉

struct glfunctions { 
    /* all the function pointers */ 
}; 
std::map<HGLRC,glfunctions> context_glfunctions; 

받는 LRU의 어떤 형태의 추가 부담 map을 사용하여 컨텍스트의 반복 된 조회가 전체 맵을 통과 할 필요가 없습니다.

-1

왜 복사 포인터가 다른 것이라고 생각하는지 이해할 수 없습니까? 포인터의 본성 때문에 문제가되지 않습니다. 포인터를 복사하면 동일한 함수를 가리키는 포인터가 여러 개 있습니다. 다른 함수를 가리 키지 않으므로 전역 적으로 또는 클래스의 정적 멤버로 저장할 수 있습니다 . 아무 문제 없음

+0

실제로 OpenGL *의 경우에는 문제가됩니다 : 복사 할 때 함수 포인터가 변경되지 않지만 다른 OpenGL 컨텍스트가 * 동일한 * 이름의 함수에 대해 다른 포인터를 제공 할 수 있습니다! – datenwolf

+0

@datenwolf 복사 할 때 포인터가 변경되지 않을 수도 있다는 것을 의미합니까? – ampawd

+2

내가 말하는 것은'void (* a)() = x; void (* b)() = a;'then a == b && a == x && b == x'. 그러나'wglMakeCurrent (dc, gl_a); a = wglGetProcAddress ("glBindBuffer"); wglMakeCurrent (dc, gl_b); b = wglGetProcAddress ("glBindBuffer");''a'와'b'는 합법적으로 다를 수 있습니다. – datenwolf

관련 문제