Graphics Programming

코어 프로필만 쓰기 본문

Season 1/OpenGL

코어 프로필만 쓰기

minseoklee 2018. 5. 24. 03:19

OpenGL 시작할 때는 화면에 뭘 그리는 거에 관심이 있었지 코어 프로필, GL 컨텍스트 생성, OS/벤더 확장이 뭔지 관심도 없었다. 그런 것들은 튜토리얼 따라하면서 freeglut, glew 등으로 대충 떼우고 기억 속에서 잊혀졌다.


빌드 환경, 프로그램 초기화 과정, 버전 관리가 중요하다는 걸 깨닫고 뒤늦게 신경쓰고 있다.


DirectX 11, Vulkan을 디버깅할 때 RenderDoc를 유용하게 써서 OpenGL에도 써볼려고 했더니



나니?



GL 4.6인데?


검색을 좀 해보니 freeglut에서 OpenGL 컨텍스트 버전과 프로필을 명시해야 하는 것 같다.


// glutInit() 호출 후

glutInitContextVersion(4, 3);

glutInitContextProfile(GLUT_CORE_PROFILE);


그런데 glTexStorage2D 호출에서 크래시가 난다. 이번에도 검색을 좀 해보니 glew는 코어 프로필을 염두에 두지 않은 오래된 뭐시기... 라는 이야기가 있어서 glew를 떼어내고 glLoadGen으로 교체했다.


GL_COMPARE_R_TO_TEXTURE, GL_LUMINANCE 등 예전에 폐기된 것들을 쓰는 코드가 몇 군데 있어서 업데이트하고 실행하니까 아무 것도 안 나온다.


RenderDoc으로 다시 열어봤다.



한 프레임 그리는데 문제가 124개 발생했다고요?


GL 커맨드들을 일일이 열어보니 VAO가 하나도 없었다. 검색해보니 호환성 프로필에서는 VAO 없이 VBO만 바인딩해도 잘 작동하는데 코어 프로필에서는 VAO도 필수로 바인딩해야 한다.


웃기게도 내 코드를 보니 VAO도 안 만들고 VAO를 쓰는 커맨드를 호출하고 있었다. VAO를 일일이 생성해서 그릴 때마다 바인딩하니까 렌더링도 제대로 되고 RenderDoc에서 캡쳐도 제대로 되었다.


다만 한 지오메트리에 VAO를 여러 개 만들어야 하는 상황은 해결하지 못했다. 그림자 패스인지, 렌더 패스인지, 무슨 머티리얼을 쓰는지에 따라 다음 조합들이 모두 필요하다.

  • position
  • position + uv
  • position + normal
  • position + uv + normal
  • position + uv + normal + tangent + bitangent

그러면 한 지오메트리 인스턴스마다 쓸지 안 쓸지 모를 VAO 5개를 생성해야 한다. 일단 최초로 요청하는 순간에 해당 VAO를 만들게 구현은 해두었는데... 애초에 마지막 조합에 대한 VAO만 만들어서 이걸 공용으로 쓰고 셰이더에서 필요 없는 attribute는 그냥 안 쓰는 게 맞는 건가? 뭐가 성능에 좋은지 모르겠다.


Comments