/usr/lib/libsora.so

Simple Mesh Library

glut에는 Cube / Sphere / Cone / Teapot…등을 렌더링할 수 있는 함수가 존재한다. 하지만 glut를 안쓰고 glfw를 쓰거나 GLES환경에서는 그런거 없다. 간단한 테스트/디버깅용으로 Cube / Sphere 등을 렌더링할수 있으면 유용하긴한데… 이거 하겟다고 본격적인 Model Loader를 추가하는것은 괜히 규모가 큰거 같아서 간단하게 사용할 수 있는 메시 라이브러리를 만들었던걸 정리해봣다.

세부 기능

  • 지원하는 형태
    • Cube
    • Sphere
    • Teapot
  • 출력 형태
    • Wire Frame
    • Mesh(Solid)
  • Vertex Format
    • Position
    • Texture Coord
    • Normal

모델을 렌더링하는데 필요한 Vertex List, Index List를 계산해준다. 원래 GLES에서 작업하던 코드라서 렌더링하는 함수는 따로 없다. 예제코드를 참고해서 쓰면 별 문제 없을 것이다.

Repo

Demo

실행하고 1~6을 누르면 아래중에서 적절히 하나가 렌더링된다.

solid cube

solid sphere

solid teapot

wire cube

wire sphere

wire teapot

사용 예제 코드

void Draw(std::vector<DrawCmdData<Vertex_1P1N1UV>> &draw_cmd_list)
{
    auto it = draw_cmd_list.begin();
    auto endit = draw_cmd_list.end();
    for( ; it != endit ; ++it) {
        const DrawCmdData<Vertex_1P1N1UV> &draw_cmd =  *it;
        GLenum mode = DrawModeToGLMode(draw_cmd.draw_mode);
        int stride = sizeof(Vertex_1P1N1UV);
        glVertexPointer(3, GL_FLOAT, stride, &draw_cmd.vertex_list[0].p);
        glTexCoordPointer(2, GL_FLOAT, stride, &draw_cmd.vertex_list[0].uv);
        glNormalPointer(GL_FLOAT, stride, &draw_cmd.vertex_list[0].n);
        glDrawElements(mode, draw_cmd.index_list.size(), GL_UNSIGNED_SHORT, &draw_cmd.index_list[0]);
    }
}
......
auto solid_cube_mesh = SolidCubeFactory(1, 1, 1).CreateNormalMesh();
Draw(solid_cube_mesh);

Resource

Comment

comments powered by Disqus