티스토리 뷰

Game/Graphics

bgfx and cmake

newpolaris 2017. 12. 21. 20:41

cmake 로 build tool chain 구성하려다

시간만 왕창 날렸다; 거지같이 복잡하다

그냥 기본 제공해 놓은 툴체인을 사용하던가 사용하는 프로젝트 코드를 복사하던가 하는 것을 추천

https://github.com/ataulien/bgfx-cmake

위에게 쉽게 이해하고 때려 박기 좋았는데;

shaderc을 생성하려하니, dulicate simbol 이 뜬다

위에서 제공하는 bgfx_common을 쪼개야하는듯;

https://github.com/JoshuaBrookover/bgfx.cmake

위에건 복잡하다만 그나마 tool도 함께 빌드된다

static global variable initialize 순서 땜시 SEGMENT_FAULT 난다면 아래 참조

https://github.com/bkaradzic/bgfx/issues/1290

cmake add_custom_target 관련

https://itk.org/Wiki/index.php?title=CMake_FAQ&redirect=no

https://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/

https://qiita.com/mrk_21/items/6d7c70edb6a64fa1a28b

여러 파일을 처리 하려면 아래와 같이

https://cmake.org/Wiki/CMake:How_To_Process_Lots_Of_Input_Files

https://gist.github.com/vlsh/a0d191701cb48f157b05be7f74d79396

add_custom_command -> add_custom_target -> add_dependencies 가 보통의 방식

하지만, OUTPUT을 add_executable 에 넣거나

${FILE}을 add_executable 에 넣어도 동작한다. (??)

bgfx.cmake 에서는 add_bgfx_shader 함수 안에 아래와 같이 사용한다.

    add_custom_command(
        MAIN_DEPENDENCY
        ${FILE}
        OUTPUT
        ${OUTPUT_FILES}
        ${COMMANDS}
        COMMENT "Compiling shader ${PRINT_NAME} for ${OUTPUTS_PRETTY}"
    )

위의 command 를 실행하기 위해 Shader 소스 까지 묶어서 SRC로 반들어서

add_custom_target 없이 add_executable 에 cpp, c, h, sc 순서로 집어넣는다.

이 방식의 문제는 make 만 단독 실행할 경우, 해당 output 삭제할 경우 파일이 없어서 삭제 못한다고 나온다.

cmake를 항상 먼저 호출한다면 문제는 발생하지 않는다.

[ 94%] Compiling shader ../../../01-cubes/fs_cubes.sc for Metal, GLES, GLSL
2017-12-22 15:13:04.707 shaderc[95215:2128167] /Users/newpolaris/Projects/ibl/bgfx.cmake/bx/src/file.cpp(181): BX Error 16799570: FileWriter: Failed to open file.
Unable to open output file '/Users/newpolaris/Projects/ibl/shaders/glsl/fs_cubes.bin'.make[2]: *** [../examples/runtime/shaders/metal/fs_cubes.bin] Error 1
make[2]: *** Deleting file `../examples/runtime/shaders/metal/fs_cubes.bin'
make[1]: *** [CMakeFiles/cubes.dir/all] Error 2
make: *** [all] Error 2

output file에 대해 몰라서 그런듯.

이정도만 하면 먼가 된거 같지만, shader의 공용파일이라던가를 처리하려면 또 머리가 아파온다.

bgfx.cmake는 common 이라는 걸 만들어서 common 파일의 것을 해결하려고 했는데;

만약, shader header만 바뀌면 처리를 어케해야하나;

bgfx.cmake도 해당 경우는 처리하지 못한다;

소스코드에서 컴파일하는 API 는 추가된듯;

https://github.com/bkaradzic/bgfx/issues/405

https://github.com/bkaradzic/bgfx/pull/1280

완전 Raw API만 support 하는줄 알았는데

임시 vertex/index buffer도 제공해준다

DX12를 DX11로 포팅할때 임시 vertex buffer는 포기했었는데

아래와 같이 이쁘게 포장해놨다.

bgfx/src/bgfx_p.h

BGFX_API_FUNC(void allocTransientVertexBuffer(TransientVertexBuffer* _tvb, uint32_t _num, const VertexDecl& _decl) )
    {
        BGFX_MUTEX_SCOPE(m_resourceApiLock);

        VertexDeclHandle declHandle = m_declRef.find(_decl.m_hash);

        TransientVertexBuffer& dvb = *m_submit->m_transientVb;

        if (!isValid(declHandle) )
        {
            VertexDeclHandle temp = { m_vertexDeclHandle.alloc() };
            declHandle = temp;
            CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexDecl);
            cmdbuf.write(declHandle);
            cmdbuf.write(_decl);
            m_declRef.add(declHandle, _decl.m_hash);
        }

        uint32_t offset = m_submit->allocTransientVertexBuffer(_num, _decl.m_stride);

        _tvb->data = &dvb.data[offset];
        _tvb->size = _num * _decl.m_stride;
        _tvb->startVertex = bx::strideAlign(offset, _decl.m_stride)/_decl.m_stride;
        _tvb->stride = _decl.m_stride;
        _tvb->handle = dvb.handle;
        _tvb->decl   = declHandle;
    }

쓰는 예제는

    bgfx::TransientVertexBuffer vb;
    bgfx::allocTransientVertexBuffer(&vb, 3, PosColorTexCoord0Vertex::ms_decl);
    PosColorTexCoord0Vertex* vertex = (PosColorTexCoord0Vertex*)vb.data;

    bgfx::setVertexBuffer(0, &vb);

'Game > Graphics' 카테고리의 다른 글

Bindless Graphics Model  (0) 2017.12.29
Seamless cube map filtering  (0) 2017.12.29
OpenGL  (0) 2017.12.20
Normalization term  (0) 2017.12.20
Why do I have irradiance as pi?  (1) 2017.12.19
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크