윈도우리스 오픈GL
윈도우리스 OpenGL 컨텍스트를 갖고 싶습니다(Xorg와 윈도우가 있는 GNU/리눅스 모두에서).합니다 만 호출할 glGetString
,glCompileShader
그와 비슷한.
저는 고글링을 좀 해봤지만, 숨겨진 창을 만드는 것 외에는 유용한 것을 생각해내지 못했습니다. 그것은 저에게 해킹처럼 보이는 것입니다.
그렇다면 (어떤 플랫폼이든) 더 나은 아이디어를 가진 사람이 있습니까?
편집: Xorg를 사용하여 OpenGL 컨텍스트를 생성하고 루트 창에 첨부할 수 있었습니다.
#include<stdio.h>
#include<stdlib.h>
#include<X11/X.h>
#include<X11/Xlib.h>
#include<GL/gl.h>
#include<GL/glx.h>
int main(int argc, const char* argv[]){
Display *dpy;
Window root;
GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
XVisualInfo *vi;
GLXContext glc;
dpy = XOpenDisplay(NULL);
if ( !dpy ) {
printf("\n\tcannot connect to X server\n\n");
exit(0);
}
root = DefaultRootWindow(dpy);
vi = glXChooseVisual(dpy, 0, att);
if (!vi) {
printf("\n\tno appropriate visual found\n\n");
exit(0);
}
glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);
glXMakeCurrent(dpy, root, glc);
printf("vendor: %s\n", (const char*)glGetString(GL_VENDOR));
return 0;
}
EDIT2: 합격된 답변을 바탕으로 windowless opengl(샘플 코드 포함)에 대한 짧은 글을 작성했습니다.
실제로 "전통적인" 렌더링 컨텍스트를 생성하려면 윈도우 핸들이 있어야 합니다(X11의 루트 윈도우나 윈도우의 데스크톱 윈도우가 이에 적합합니다).OpenGL 정보 및 익스텐션 가용성을 가져오는 데 사용됩니다.
이 정보를 얻으면 렌더 컨텍스트를 파괴하고 "더미" 창을 해제할 수 있습니다!
ARB_extensions_string 및 ARB_create_context_profile(다음 페이지에서 설명) 확장을 테스트해야 합니다.ARB_create_context).그런 다음 CreateContextAttributes를 플랫폼에 독립적인 방식으로 호출하여 시스템 창이 연결되지 않고 시스템 장치 컨텍스트만 필요로 하는 렌더 컨텍스트를 만들 수 있습니다.
int[] mContextAttrib = new int[] {
Wgl.CONTEXT_MAJOR_VERSION, REQUIRED_OGL_VERSION_MAJOR,
Wgl.CONTEXT_MINOR_VERSION, REQUIRED_OGL_VERSION_MINOR,
Wgl.CONTEXT_PROFILE_MASK, (int)(Wgl.CONTEXT_CORE_PROFILE_BIT),
Wgl.CONTEXT_FLAGS, (int)(Wgl.CONTEXT_FORWARD_COMPATIBLE_BIT),
0
};
if ((mRenderContext = Wgl.CreateContextAttribs(mDeviceContext, pSharedContext, mContextAttrib)) == IntPtr.Zero)
throw new Exception("unable to create context");
그런 다음 렌더링을 원하는 경우 프레임 버퍼 개체 또는 시스템 창을 생성된 렌더링 컨텍스트에 연결할 수 있습니다(그러나 쉐이더만 컴파일하려는 것으로 알고 있습니다).
CreateContextAttributes를 사용하면 다음과 같은 많은 장점이 있습니다.
- 플랫폼에 구애받지 않습니다.
- 특정 OpenGL 구현 요청 가능
- > 3.2 OpenGL 구현 요청 가능
- 순방향 호환성 옵션을 강제 적용할 수 있습니다(그림자 전용 렌더링, 그것이 미래의 방식입니다).
- 특정 OpenGL 구현 프로파일을 선택(정방향 호환 컨텍스트에서만)할 수 있습니다(실제로는 CORE 프로파일만 있지만 앞으로 더 많은 프로파일이 있을 수 있습니다).
- 실제 드라이버 구현에서 이 옵션을 사용할 수 있는 방법이 정의되지 않더라도 디버깅 옵션을 사용할 수 있습니다.
그러나 이전 하드웨어/드라이버는 이 확장을 구현할 수 없으므로 이전 버전과 호환되는 컨텍스트를 만들기 위해 폴백 코드를 작성하는 것이 좋습니다.
창을 만들기 전까지 OpenGL은 사용자가 어떤 구현을 사용하는지 알 수 없습니다.예를 들어 원격 X-Windows 세션의 OpenGL과 DRIX-Windows 세션의 OpenGL은 매우 다른 드라이버(그리고 하드웨어 가속도 다릅니다)가 있습니다.쉐이더 언어 지원은 이 경우에 따라 다를 수 있으며 쉐이더 컴파일러의 출력은 물론 리소스 소진에 따라 생성된 오류에 따라 구현에 의존적일 수 있습니다.
따라서 실제로 창을 만드는 것이 100% 필요하지 않을 수도 있지만, 그래픽 하드웨어에 어떻게든 컨텍스트를 연결해야 하며, 이 작업을 창으로 수행할 수 있기 때문에 아무도 대체 방법을 구현하는 데 어려움을 겪지 않았습니다.
컨텍스트를 호스팅할 창이 필요하고 무엇이든 할 수 있는 컨텍스트가 필요합니다.
아무것도 표시하지 않으려면 창을 보이지 않게 만듭니다.
다른 방법이 있다면 어디선가 기록되어 있을 것이고, 드물지 않은 문제이기 때문에 쉽게 찾을 수 있을 것입니다.
제가 한 일들 중 하나는, 분명히 약간의 해킹이지만, 저만의 GL 창을 만드는 데 드는 오버헤드를 피하기 위해 한 일입니다. 개방형 프로세스 창을 활용하는 것입니다.
OpenGL을 이해하는 핵심은 다음과 같습니다.wglCreateContext에 대한 호출로 GL 컨텍스트를 생성하는 데 필요한 것은 유효한 DC뿐입니다.
문서에는 당신이 소유한 것이어야 한다는 내용이 없습니다.
테스트를 위해 Worlds Of Warcraft를 팝업하고 SPY++를 활용하여 윈도우 핸들을 얻은 다음 수동으로 해당 핸들을 GetDC에 연결하여 유효한 Device Context를 반환하고 거기서 GL 코드의 나머지 부분을 정상처럼 실행했습니다.
나만의 GL 창 생성은 없습니다.
월드 오브 워크래프트와 스타트렉 온라인 https://universalbri.wordpress.com/2015/06/05/experiment-results 에서 이 작업을 수행했을 때의 상황은 다음과 같습니다.
따라서 질문에 대답하기 위해 창이 필요합니다. 하지만 설명서에는 창을 소유해야 한다는 내용이 없습니다.
이제 다음 사항을 받으십시오.데스크톱 창을 사용하여 유효한 시각적 출력을 제공하는 이 방법을 얻을 수는 없었지만 HWND용 getDeskTopWindow API를 사용하여 DC를 성공적으로 만든 다음 GetDC로 호출할 수 있었습니다. 따라서 OpenGL을 사용하고 싶은 비시각적 처리가 있으면 무엇을 하고 있는지 알려주세요.그리고 GetDesktop Windows 메서드가 비주얼과 함께 작동하는 경우 이 스레드에 작업한 내용을 다시 게시하십시오.
행운을 빌어요.
그리고 아무도 할 수 없다고 말하지 못하게 하세요.
뜻이 있으면 길이 있습니다.
GLFW를 사용하면 윈도우 힌트 하나만 설정하면 됩니다.
언급URL : https://stackoverflow.com/questions/2896879/windowless-opengl
'source' 카테고리의 다른 글
Android용 새 Intel 에뮬레이터 실행 (0) | 2023.09.24 |
---|---|
숫자를 분 단위로 변환하려면 어떻게 해야 합니까? (0) | 2023.09.24 |
MySQL에서 실제로 SQL 주입을 일으킬 수 있는 문자는 무엇입니까? (0) | 2023.09.24 |
C# MySqlClient를 사용하여 MariaDB에 연결하는 방법 (0) | 2023.09.24 |
curl cmd를 jQuery $.ajax()로 변환하는 중 (0) | 2023.09.24 |