2013-05-01 7 views
2

Derelict3와 함께 놀았습니다 & this에 따라 D에서 OpenGL을 사용하려면 glfw를 사용하고 확장 프로그램을 사용하려면 먼저 컨텍스트를 만들어야합니다. glfw를 사용하여 창을 만들고 현재 컨텍스트로 설정합니다. 컨텍스트를 만들고 설정 한 후에 모든 확장을로드하려면 DerelictGL3.reload()을 사용해야합니다.확장 용로드를 위해 가짜 OpenGL 컨텍스트 만들기

이제 창을 만들기 전에 모든 준비를하고 싶습니다. 이러한 준비 중 하나는 모든 셰이더 프로그램을로드하고 컴파일하는 것입니다. 그러나이 컨텍스트없이 실행을 거부 Derelict3GL.reload()을 필요로하는 쉐이더 확장, ... 그래서

, 나는이 hackish 해킹 사용했습니다 필요 :이 작동

auto tmpWindow=glfwCreateWindow(1,1,"",null,null); 
glfwMakeContextCurrent(tmpWindow); 
DerelictGL3.reload(); 
glfwDestroyWindow(tmpWindow); 

을 - 지금로드 할 수 있습니다 셰이더 프로그램 을 컴파일 한 다음 실제 창을 엽니 다. 그러나 이것은 나에게 너무 익숙하지 않은 것처럼 보입니다. 컨텍스트 가짜 또는 컨텍스트없이 확장을로드하는 적절한 방법이 있습니까?

+0

아마도 더 좋은 방법은 먼저 창을 만드는 것이지만 보여주지 않는 것입니다. 그런 다음 확장을로드하고 쉐이더를 컴파일 한 다음 창을 표시하십시오. 왜 창 만들기를 연기해야하는지 잘 모르겠다. 그래서이 솔루션이 당신의 목적에 부합하는지 알지 못한다. – Kevin

+0

주된 문제는 내 개체 디자인과 일치하지 않는다는 것입니다. 나는 각각의 컨텍스트와 함께 여러 개의 창을 만들 수 있기를 원한다. 즉,'Window' 객체의 생성을 모든 라이브러리의 초기화와 분리해야합니다. –

+0

그렇다면 실제로 언급 된 해결책이 가장 좋습니다. – Kevin

답변

3

컨텍스트를 가짜로 만들거나 컨텍스트없이 확장을로드하는 적절한 방법이 있습니까? 윈도우와

: 플랫폼 이서에 따라

(즉, 화면에 눈에 띄게 매핑 할 필요가 없습니다) 중간 창을 통해 그 일을 안정적으로 Windows에서 확장을로드 할 수있는 유일한 방법입니다.

X11/GLX : 확장 기능 포인터는 glXGetProcAddress 광고를 사용하여 즉시로드 할 수 있습니다. 확장 기능은 GLX 클라이언트 라이브러리의 일부이며 모든 컨텍스트에 공통입니다. 그러나 실제 OpenGL 컨텍스트는 glXProcAddress를 통해 유효하게 얻을 수있는 모든 기능을 지원하지 않을 수 있습니다.

+0

음, 분명히 확장 기능을 하나씩 'glXGetProcAddress'와 함께로드하고 싶지는 않습니다 ...하지만 내 tmpWindow 보이지 않는 사운드를 만드는 것이 좋은 생각입니다! 현재는 나타나지 않지만 너무 빨리 파괴하기 때문에 또는 그것을 닫기 전에'Thread.sleep'을 호출하지 않기 때문에 모르겠지만 명시 적으로 숨김으로 설정하는 것이 좋습니다. –

+0

물론 보이지 않는 창과 연결된 컨텍스트를 통해 확장을로드 할 수 있습니다. – ponce

+0

@ponce : 기술적으로 당신은 명시 적으로 PIXELFORMATDESCRIPTOR를 설정하여 무언가를 갖기 위해 윈도우 만 필요로합니다. OpenGL 컨텍스트를 첨부하여 현재 쓰레드에 존재하게 할 수 있습니다. X11/GLX는 그저 창문보다 몇 가지 선택 사항을 제공합니다. Windows 운영 체제는 이와 관련하여 다소 제한적입니다. – datenwolf