source

윈도우리스 오픈GL

ittop 2023. 9. 24. 13:08
반응형

윈도우리스 오픈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_stringARB_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

반응형