2018년 1월 13일 토요일

OpenGL and Direct3D Header Files

OpenGL and Direct3D Header Files


우리는 컴퓨터 그래픽스 프로그래밍에 있어서 기본이 되는 Direct3D 및 OpenGL 기술에 대하여 알아 보고 있다.


또한 이러한 기술을 C/C++ 프로그래밍 기술에 의하여 살펴 보고자 한다.


C/C++ 프로그래밍은 어떠한 외부 라이브러리 또는 API 와 같은 인터페이스 기술을 가져와서 사용하고자 할 경우 header 파일을 이용하여 연결하고 코딩 하게 된다.


사실 엄밀히 말하면 header 파일은 하나의 혁식적인 측면에서 사용하는 것이지,그것 자체가 목적이 되지는 않는다.


많은 대부분의 C/C++ 라이브러리나 인터페이스 (API) 들은 header 파일을 제공하고 있다. 이는 해당 라이브러리에 포함된 함수 또는 Class들의 호출 규칙을 정해 놓은 파일이다.


그러므로 대부분의 C/C++ 개발자들은 해당 라이브러리나 인터페이스를 자신의 코드에서 호출하여 사용하고 싶을때 이들 header 파일의 존재를 확인하는것이 우선이 될 것이다.


Visual C++ 이나 C++ Builder 들은 해당 컴파일러를 시스템에 설치할 경우 라이브러리,  API 등과 같이 header 파일들도 자동으로 설치되어 사용할 수 있도록 준비하고 있다.


단 Direct3D 나 OpenGL 역시 각각 서로의 version 시스템이 있기 때문에 자신이 사용하고 싶은 version에 대한 header 파일을 사용하도록 하고 있다.


대부분의 컴파일러는 해당 컴파일러가 배포되는 싯점에서의 최신의 라이브러리를 제공하고자 노력하고 있다.


사실 OpenGL은 그 version 에 대하여 header 파일 이름이 따로 존재하지는 않는다. 그러나 Direct3D는 header file에 해당 버전의 숫자를 이름에 적용하고 있다. 이러한 부분이 Direct3D 와 그 개발 환경면에서 차이를 보인다고 볼 수 있지만, 중요한것은 아니다.


자신이 설치된 컴파일러에서 기본적으로 제공하는 라이브러리 또는 API를 사용할 수도 있으나 따로 해당 기술의 지원 페이지에서 원하는 버전의 라이브러리를 취득한 후 사용할 수 도 있으나 최신의 컴파일러를 설치하면 해당 컴파일러가 지원하는 최신의 API가 제공된다고 생각해도 틀리지 않으니 가능하면 이를 따르는것도 나쁘지 않다.

OpenGL Header Files






#include <gl/glew.h>
#include <gl/gl.h>
#include <gl/glu.h>


위의 3개의 header 파일이 기본으로 사용하는 파일들이다. 사실 glew.h 는 OpenGL 기본파일이 아니고 확장 파일이다.


GLEW 는 OpenGL SDK page에서 그 설명을 간단히 볼 수 있다.


GLEW is an open-source cross-platform extension loading library with thread-safe support for multiple rendering contexts and automatic code generation capability. GLEW provides easy-to-use and efficient methods for checking OpenGL extensions and core functionality.


간단히 해석을 해보면, GLEW 는 open source 이며 cross-platform 확장 라이브러리로 제공되며 이는 다중 렌더링을 위하여 스레드 세이프 코드로 제공한다. GLEW는 OpenGL 확장과 핵심 기능을 확인하는 데 사용하기 쉽고 효율적인 방법을 제공한다.

라고 되어 있다. 일반적으로 컴파일러가 기본적으로 제공하는 라이브러리에는 GLEW는 제공되고 있지 않은 경우가 많다. 내가 아는 한 대부분 기본으로 제공하지 않고 있다.

GLEW의 준비


그러므로 GLEW 는 스스로 다운로드 받아 자신의 개발 환경에 포함시켜 줘야 한다.


이글을 작성하는 필자는 Visual Studio 에서 제공하는 Visual C++ 과 RADSTUDIO 의 C++ Builder 를 모두 사용하고 있다. 두 경우 스스로 GLEW를 준비해야 하는 것은 마찬가지이다.


예를 든 두개의 컴파일러는 그들이 링크할 수 있는 object library의 format 구조가 다르다. 그러므로 OPENGL 홈페이지에서 받은 링크 가능한 파일을 받았다고 해도 직접 사용할 수 없는 경우가 많다.


특히 C++ Builder 에서 연결하고자 하는 라이브러리는 대부분의 라이브러리에서 제공하고 있지 않다. 윈도우의 경우 Visual C++ 용으로로 제공되며 GNU C 환경의 각종 컴파일 라이브러리로 제공하기도 하지만….. C++ Builder는 아니다.


그렇다고 못구하는 것은아니다. 구하지 못하면 만들면 된다.
사실 만든다는것은 아니고 “직접 만들어 낸다” 라고 생각하면 더 맞을 것이다.

GLEW 는 OpenSource 이다. 그러므로 누구나 쉽게 그 소스코드 (C 코드로 작성되었다)를 다운로드 받아 자신의 C 컴파일러로 컴파일 하면 된다.
가장 쉽고 확실한 방법이다.


GLEW C 소스 코드는 하나의 C 파일로 되어 있으니 복잡하지도 않으니 이 방법을 사용하기 바란다.  GLEW 소스코드를 받으면 3개의 C 파일이 있을텐데 두개는 그냥 테스트 코드이니 개의치 말기 바란다.


GLEW Website



Source

ZIP |  TGZ


Binaries





컴파일 하기 싫다면 미리 컴파일된 바이너리 파일을 받아도 상관없다. 나 역시도 바이너리 파일을 받아 링크하여 사용하고 있다. 그런것이 속편하다. ^^


GLEW 바이너리 파일을 받아보면 위와 같은 내용으로 이루어 진다. LICENSE.txt 는 읽어보기 바라며 만약 자신이 만든 어플리케이션이 GLEW를 사용하고 있다면 이 License.txt 의 내용을 명시해주는 용도로 사용하면 된다.


실제로 프로그래밍에 필요한 부분은 include 와 bin 의 각 시스템 버전에 맞는 DLL 파일이다.
glew32.dll 파일이 그렇다. 이는 Win32 와 x64 를 위하여 따로 구분된 파일을 제공한다.
단 아쉬운점은 64비트 버전도 이름은 glew32.dll 이라는 것이 아쉽다.


Visual C++ 을 사용한다면 lib 폴더의 lib 파일을 링크에 추가해 주면 된다.
그러나 C++ Builder 를 컴파일러로 사용한다면 lib 파일을 직접 사용할 수 없다.
그러므로 DLL 파일에서 object 파일을 생성하여 사용해야 한다.


그렇다고 크게 걱정할 필요는 없다. C++ Builder에 이러한 기능을 제공하고 있기 때문이다.
mkexp.exe
이는 C++ Builder 사용자에 해당하니 Visual C++ 사용자는 몰라도 되는 사항이다.
mkexp.exe 는 64bit 용이고 32비트용은 implib.exe 일 것이다.


둘다 사용법은 비슷하다. 두 프로그램의 사용법은 쉽게 알수 있을 것이다.


mkexp 의 사용법만 여기에 예를 들겠다.


mkexp glew.a glew32.dll


DOS 창을 열고 위와 같이 명령을 수행하면 (mkexp 가 있는 부분이 path 로 링크가 걸리는것은 당연하겠지만)   glew32.dll 에서 link 가능한 object 파일을 생성해 줄 것이다.
64비트의 경우 확장자가 .a 를 기본으로 사용한다는 것은 다 아는 내용이고..


여기서 만들어진 glew.a 파일을 link 에 포함시키면 된다. 프로젝트에 직접 포함해도 되고 자신의 source code에 #pragma link 로 포함시켜도 될 것이다.


복잡하게 설명 했지만 위의 글의 요약은 dll 과 header file들, dll호출을 위한 object 파일을 준비하는 내용이라 하겠다.

사실 Open Source 는 소스코드도 구하고 그 기술도 무료로 사용할 수 있는 장점은 있지만 그 확장이 매우 다양하기 때문에, 이를 사용하는 개발환경을 정확히 구축하는 것은 그렇게 만만히 볼 일은 아니다.


GLEW 외에 다양한 확장 라이브러리가 존재한다. 그러나 OpenGL 을 시작하는 입장에서 다른 다양한 확장은 없어도 무난하다. 그냥 OpenGL 자체와 GLEW 정도로 준비하면 된다.


나는 아주 가끔 mingw 를 컴파일러로 사용하기도 한다. 즉 gcc 를 사용할때도 있다는 것이다.
mingw 는 cross plotform 코드를 만들어 내는데 유용하기 때문이다. mingw 에서도 OpenGL을 사용하기 위해서는 비슷한 준비과정이 필요하지만 gcc 환경에서의 OpenSource 라이브러리의 설치는 더 편리한것 같다는 생각이 든다.


어쨌든 자신의 소스코드에
#include <gl/glew.h>
#include <gl/gl.h>
#include <gl/glu.h>


를 추가 한 후 컴파일이 성공하게 되면 OpenGL 프로그래밍을 시작할 환경은 준비된 것이라 생각하면 된다.


여기서 glew.h 는 gl.h , glu.h 보다 앞서 위치해야 한다는것은 명심하자.
사실 확장이 베이스보다 앞에 나온다는것이 의아하기는 하다..



Direct3D Header Files


#include <d3d11.h>
#include <d3dx10.h>
#include <d3dcompiler.h>


Direct3D 프로그래밍을 위하여 우리는 Direct3D 11 을 사용할 것이다. 과거 몇년동안 아니면 지금도 Direct3D9 을 사용하는 경우가 많지만 여기서는 Direct3D 11을 사용하도록 하겠다.


일단 Direct3D 는 기본 컴파일러에서 제공하는 Windows SDK를 설치하거나 Microsoft Soft 에서 제공하는 것을 설치해도 된다.
이경우 역시 C++ Builder 사용자라면 앞에서와 같이 DLL link를 수행할 수 있는 object 파일(library) 을 준비해야 하며 여기서 따로 설명하지는 않겠다.


일단 자신의 컴파일러에서 위의 header 파일을 소스코드에 넣고 컴파일 해보기 바란다.


d3d11l.lib 나 d3d11.a 파일 (target version에 맞추어) 링크에 추가해주면 될 것이다.

Direct3D에 있어서는 특별한 확장 라이브러리를 사용하지는 않을 것이지만 d3dx10.h 파일이 제공하는 메크로 확장 코드는 사용할수도 있으리라 생각한다.


d3dx11 이라고 해도 d3dx10 의 기능은 사용하지 않는 것이 아니며, 지금 싯점에서 d3dx11에서도 몇가지 매크로 함수들은 d3dx10 의 것을 그대로 사용하고 있기 때문이다.


또한 HLSL , 즉 Shader 프로그래밍을 하기 위하여 Shader 컴파일러가 필요하며 이는 d3dcompiler.h 에 정의 되어 있으므로 이것도 테스트 하기 바란다.

댓글 없음:

댓글 쓰기

Vertex , 정점 정보의 확장

Vertex , 정점 정보의 확장 그동안의 설명에 있어서 우리는 VERTEX 정보에 대하여 3 차원의 위치 정보만 사용하였다. struct VERTEX {float x,y,z;}; 이제 이를 확장하여 색상을...