티스토리 뷰
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://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