Graphics/OpenGL

초기 세팅과 관련해서 공부한 내용

va95 2023. 12. 26. 03:11

 

// 대부분의 플랫폼
#include <GL/gl.h>

// MacOS(deprecated 되는중..)
#include <OpenGL/gl.h>

 

렌더링에 필요한 필수 함수들을 가지고 있다.

  • glFinish, glColor3f, ... 등

 

플랫폼(win, mac, ...) 마다 위 헤더를 제공해준다.

  • win의 경우, win95 이상이라면 opengl 1.1 버전까지의 api를 가지고 있는 헤더를 주고 있다. 이후 버전의 api는 전방 선언되지 않아서 컴파일 타임에 사용할 수 없다.(복잡한 방식으로 사용할 수 있긴 한데 아래에서 기술한다)
  • mac의 경우, os 버전 마다 opengl에 선언된 api들이 다르다. 최신 os 라면 최신 gl api들이 전방 선언되어 있다.

 

win 빌드 시, opengl32.lib를 링크해야한다.

  • 그래픽 카드 벤더사(ex. intel, nvidia, amd, ...)에서 제공하는 .dll으로 실제 구현부가 작성되어 있다.
  • 1.2 버전 이상의 구현부는 다른 .dll에 있다(찾진 못했다..)
  • gl.h에 1.1 버전 이하의 api가 전방 선언 & opengl32.lib(->opengl32.dll)을 통해
    • 1.1 버전까지의 api를 컴파일 & 런타임에 사용 가능
  • 1.2 ver 이상의 api를 사용하려면 다음처럼 심볼을 찾아야한다.
    •  
      • 1.2 ver 이상은 wglGetProcAddress라고 windows에서 만들어놓은 함수로 얻어올 수 있다.
    • typedef void (*GL_GENBUFFERS) (GLsizei, GLuint*); GL_GENBUFFERS glGenBuffers = (GL_GENBUFFERS)wglGetProcAddress("glGenBuffers");​​
  • 1.1 ver 이하는 이렇게 사용안해도 전방 선언되어 있고, 링크가 되어있기 때문에 바로 사용 가능  
    • 다만, 뭐.. 함수 포인터 얻어오고 싶다면, 아래처럼 추가적으로 얻어서도 사용 가능
    • auto module = LoadLibraryA("opengl32.dll");
      auto proc = GetProcAddress(module, "glViewport");​
       

mac 빌드 시, Xcode 프로젝트에서 프레임워크 추가 쪽에 OpenGL.framework 넣어주기

  • 소스 보니, 3.2까지 지원하는 것 같다..
  • mac은 바로 컴파일 & 런타임 사용 가능하고, win 처럼 얻어서 사용도 가능하다.
    • auto framework = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.opengl"));
      auto proc = CFBundleGetFunctionPointerForName(framework, "glViewport");

 

-> 버전별 지원안되는 api 사용하려고 시도하면 크래시 발생하는 것 같다.(함수 포인터가 nullptr이거나 링킹 안되서..?)


// 대부분의 플랫폼
#include <GL/glu.h>

// MacOS(deprecated 되는중..)
#include <OpenGL/glu.h>

 

gl.h를 사용하면서 써볼만한 유틸 함수들을 가지고 있다.

  • gluPerspective, gluLookAt 이런 함수들..

 


gl.h를 사용할 때 windows 처럼 매번 사용할 함수들 전방 선언하고 심볼 로드하고 귀찮아진다..

-> GLAD 사용하자

 

GLAD

  • 크로스 플랫폼
  • 버전 별 모든 API 전방 선언해놓았다;;(최근 본건 4.6까지)
  • 모든 심볼 로드 시도한다.