macOS에서 OpenGL 프로그래밍 (2-6. 정점 데이터에 GLKit 구조체 사용)

macOS에서 OpenGL 프로그래밍의 목차로 돌아가기

소개



지난번 까지, 텍스처를 복수장 조합해 표시할 수 있게 되었습니다.

이번에는 GLKit의 구조체를 사용하여 2~4차원 벡터나 4x4 행렬, 쿼터니언 등 게임 개발에 필수적인 수학 라이브러리를 이용할 수 있도록 준비합시다.

1. 헤더 파일 포함



GLKit에 정의된 벡터, 행렬 및 쿼터니온을 나타내는 구조체를 사용하려면 GLKit의 GLKMath.h를 포함합니다. GLKit 프레임워크는 제1회 에서 프로젝트를 만든 직후에 추가되므로 헤더 파일을 포함하는 것만으로 쉽게 사용할 수 있습니다.

Game.hpp(일부)
...
#include <OpenGL/OpenGL.h>
#include <OpenGL/gl3.h>
#include <GLKit/GLKMath.h>
...

GLKit 프레임 워크의 모든 기능을 사용하려면 일반적으로 #import <GLKit/GLKit.h>라고 쓰지만 Objective-C의 기능을 사용하기 때문에 C++을 함께 사용할 때 관련 구현 파일의 확장자 를 ".mm"로 해야 합니다. 지금까지 사용해 온 Game.cpp에서는 Pure C++로 구현을 진행해 나가고 싶기 때문에 GLKit.h는 사용하지 않습니다. GLKMath.h부터는 C 언어에서도 C++에서도 이용 가능한 구조체나 함수만이 정의된 파일이 포함되어 있으므로 이쪽을 사용합니다.

이제 벡터를 나타내는 GLKVector2, GLKVector3, GLKVector4 등의 구조체, 행렬을 나타내는 GLKMatrix4 구조체, 쿼터니온을 나타내는 GLKQuaternion 구조체를 이용할 수 있게 됩니다. 또, 그것에 관련한 함수도 사용할 수 있게 됩니다.

2. 정점 데이터의 정의를 GLKit의 구조체로 치환



GLKit 프레임워크가 제공하는 구조체를 사용할 수 있게 되었기 때문에, Game.cpp에서 GLfloat형의 배열을 사용해 정의해 온 정점 데이터를 나타내는 VertexData 구조체를, 이러한 구조체를 사용하도록 변경해 합니다.

Game.cpp(VertexData 구조체―변경 전)
struct VertexData
{
    GLfloat     pos[3];
    GLfloat     color[4];
    GLfloat     uv[2];
};

Game.cpp(VertexData 구조체―변경 후)
struct VertexData
{
    GLKVector3  pos;
    GLKVector4  color;
    GLKVector2  uv;
};

이에 따라 VAO에서 참조하는 버퍼의 포맷을 지정하기 위한 glVertexAttribPointer() 함수를 호출하고 있는 개소의 수정이 필요하게 됩니다. 배열의 때에는 변수명을 직접 쓰는 것만으로 포인터치를 취득할 수 있습니다만, 이것이 구조체가 되었으므로, & 연산자를 사용해 포인터치를 취득하도록(듯이) 변경합니다.

Game.cpp(게임
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), ((VertexData *)0)->pos);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(VertexData), ((VertexData *)0)->color);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), ((VertexData *)0)->uv);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

Game.cpp(게임
    glGenVertexArrays(1, &vao);
    glBindVertexArray(vao);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), &((VertexData *)0)->pos);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(VertexData), &((VertexData *)0)->color);
    glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), &((VertexData *)0)->uv);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);

이상의 변경이 완료되면, 실행해 봅시다. 이전까지의 동작과 다르지 않은 것을 확인할 수 있습니다.



여기까지의 프로젝트 : MyGL은 _s로 p2-6. 지 p

3. 정리



이번은 이것뿐입니다. Game.cpp에서 사용하고 있는 Pure C++에서도 GLKit 프레임워크의 구조체나 그것에 관한 함수를 이용할 수 있으므로 앞으로는 그것을 사용하여 게임 개발을 진행해 나가겠다는 이야기였습니다.

OpenGL 자체는 벡터와 행렬을 다루는 구조체 또는 클래스를 제공하지 않습니다. 그러므로 OpenGL에서 벡터와 행렬을 처리하기 위해서는 클래스를 직접 만들거나 기존 라이브러리와 프레임 워크를 활용해야합니다.

OpenGL 용 수학 라이브러리로 유명한 것에는 GLM (OpenGL Mathematics)이라는 라이브러리가 있습니다. Windows나 Linux에서도 컴파일하고 싶은 경우는, 이쪽을 사용하는 것을 추천합니다.

다음 기사 : macOS에서 OpenGL 프로그래밍 (3-1. 행렬을 사용하지 않고 3D 투시 변환 수행)

좋은 웹페이지 즐겨찾기