FBX Sdk튜토리얼 빌드 ‘외않되’ (FBX 튜토리얼 cmake빌드설정 고치기)

JellyPower·2023년 8월 29일

뻘글

목록 보기
2/2

FBX Renderer를 만들어 봅시다.

  • 최근 자체제작 게임엔진 만들기 프로젝트를 시작하며 제일 먼저 하고있는 일은 FBX Rednerer이다.
  • 굳이 왜 FBX파일인가? 를 묻는다면 개인적으로 살펴보기에 가장 대중적으로 사용되는 3D파일 포맷이라고 생각했기 때문이다.
    • obj파일은 포함될 수 있는 정보가 제한적이고 3ds파일은 프로그램간 교환에 적합한 파일포맷이 아니다.
    • 그에 반해 FBX파일은 다양한 정보가 담길 수 있으며 오토데스크에서 자체적으로 SDK를 지원한다.
    • 또한, 보통 모델링 프로그램을 사용하면 거의 오토데스크의 3ds max, maya등을 사용하고 3D프로그램간 통용되는 교환 포맷으로 FBX를 만들었기 때문에 호환성에 큰 문제가 없기 때문에 아주 무난한 선택지라고 볼 수 있다.

FBX를 먼저 까봐야겠지?

  • FBX파일을 까보고 렌더링 정보를 뽑아오기 위해선 FBX파일의 구조를 이해해야 한다.
  • 그런데 웬걸? 오토데스크 개발자 홈페이지에 가보면 애초에 FBX파일은 애초에 텍스트 기반 문서가 아닌 바이너리 형태라고 한다.
  • 그렇기에 “우선은” 오토데스크에서 제공하는 FBX SDK를 까보는게 FBX파일 구조를 이해하는 최선의 방법이라고 볼 수 있겠다.
  • 그래서 우선은 FBX SDK를 다운받으면 같이 딸려오는 튜토리얼을 분석해보고자 한다.

FBX SDK - Tutorial

그러지 말아다오…

D:\FBXSDK\2020.3.4\samples\Camera\out\build\x64-Debug\ninja : error : build.ninja:79: bad $-escape (literal $ must be written as $$)
    LINK_LIBRARIES = D:\FBXSDK\2020.3.4\lib\vs2022\x64\$(Configuration)\li...
                                                       ^ near here
  • Ahh… 프로젝트를 빌드해보니 빌드 설정에 오류가 있어 안된다…
  • 어차피 튜토리얼 프로젝트들 SDK 빌드버전도 윈도우 전용만 올려놨으면서 굳이구태여 cmake프로젝트로 업로드를 해놨다. makefile은 귓등으로 찍어먹어보긴 했어도 cmake까진 써본적 없는데…

그래도 어찌저찌 해결 했습니다. (해결책)

  • 하하. cmake라도 별 거 있겠는가? 어차피 빌드 설정일 뿐. 어떻게든 굴러보면 되지 않을까?
  • 대충 cmake코드도 보다보니 뭔가 익숙해진다. 물론… 빈 파일 던져주고 새로 짜보라면 못짜겠지만… cmake설명해달라면 하나도 하진 못할테지만…
  • 어쨋든 위에 나온 에러 로그가 꽤나 직관적으로 떴기 때문에 cmake파일 들어가서 해당 부분만 찾아보면 어찌저찌 해결 할 수 있을 것으로 보인다.

진짜 해결책

  1. 빌드하려는 프로젝트의 CMakeLists.txt 파일을 열어보자. 최상단에 INCLUDE("../../CMakeSettings.txt") 라는 코드가 보일 것이다. 이것정도는 cmake를 안써봤어도 대충 cpp짬밥이 있으면 이해 할 수 있다. #include랑 똑같겠지 뭐. 경로 따라가서 CMakeSettings.txt 파일을 확인해보자.

    SET(CMAKE_MIN_REQ_VERSION 2.4)
    cmake_minimum_required(VERSION ${CMAKE_MIN_REQ_VERSION})
    INCLUDE("../../CMakeSettings.txt")
    IF(NOT WIN32)
        MESSAGE(SEND_ERROR "This sample can only compile on Windows platform.")
        RETURN()
    ENDIF()
    
    FBX_PROJECT(UI_Example_SceneTreeView .)
    SET(FBX_TARGET_SOURCE
        "resource.h"
        "SDK_Utility.cxx"
        "SDK_Utility.h"
        "stdafx.h"
        "UI.cxx"
        "UI.h"
        "UI.ico"
        "UI.rc"
    )
    ADD_EXECUTABLE(
        ${FBX_TARGET_NAME}
        WIN32    #sets the application subsystem to Windows Application instead of Console
        ${FBX_TARGET_SOURCE}
    )
    SET_SAMPLES_GLOBAL_FLAGS()
  2. CMakeLists.txt파일로 들어왔다. 코드가 많아보여서 무섭지만 사실 핵심은 위 에러 로그에서 떴던 $(Configuration) 요놈을 찾으면 된다. Ctrl+F 하니까 바로 나오는구만

    SET(FBX_VARIANT "$(Configuration)")
        
        IF(MSVC_VERSION GREATER 1910 AND MSVC_VERSION LESS 1920)
            SET(FBX_COMPILER "vs2017")
        ELSEIF(MSVC_VERSION GREATER 1919 AND MSVC_VERSION LESS 1930)
            SET(FBX_COMPILER "vs2019")
        ELSEIF(MSVC_VERSION GREATER 1929 AND MSVC_VERSION LESS 1940)
            SET(FBX_COMPILER "vs2022")
        ENDIF()
        SET(FBX_TARGET_LIBS_PATH "${FBX_ROOT}/lib/${FBX_COMPILER}/${FBX_ARCH}/${FBX_VARIANT}")
        SET(FBX_SDK_ABS ${FBX_TARGET_LIBS_PATH}/${FBX_SDK})
        SET(FBX_REQUIRED_LIBS_DEPENDENCY ${FBX_SDK_ABS})
    • 우선 첫 번째 문제론 저 위에 SET(FBX_VARIANT "$(Configuration)")코드만 { 가 아니라 ( 를 쓴다. 사실 cmake를 제대로 안써봐서 저게 제대로 작동 할 수도 있겠지만 코드가 통일돼있지 않다는 것부터 맘에 안든다. 우선 바꿔주자.
  3. 바꿔주니까 에러로그가 바뀌었다!

    'D:/FBXSDK/2020.3.4/lib/vs2022/x64/libfbxsdk-md.lib',
     needed by 'D:/FBXSDK/2020.3.4/bin/vs2022-md/UI_Example_SceneTreeView.exe',
     missing and no known rule to make it
    D:\FBXSDK\2020.3.4\samples\UI Examples\SceneTreeView\out\build\x64-Debug\SceneTreeView
    D:\FBXSDK\2020.3.4\samples\UI Examples\SceneTreeView\out\build\x64-Debug\ninja	1
    • 역시 string을 parsing하는 규칙 자체가 {를 쓰는건지 위의 문제는 해결됐다.
    • 그런데, 이번엔 라이브러리가 missing돼있다고 한다. 실제 디렉토리를 찾아서 가보니 실제 라이브러리 주소는 D:\FBXSDK\2020.3.4\lib\vs2022\x64\release\libfbxsdk-md.lib 이다.
    • 디버그용, 릴리즈용 디렉토리가 따로 있고 해당 디렉토리주소가 라이브러리 위치에 포함돼있어야 하는데 그게 포함이 안돼있다.
  4. 코드를 보니까 변수 설정에 문제가 있는 것 같다.

    .
    .
    .
    IF(NOT FBX_VARIANT)
        SET(FBX_VARIANT "debug")
    ENDIF()
    
    SET(FBX_DEBUG)
    IF (FBX_VARIANT MATCHES "debug")
        SET(FBX_DEBUG 1)
    ENDIF()
    .
    .
    .
        
        SET(FBX_VARIANT "${Configuration}") # Configuration은 외부로부터 들어오는 값
        
    .
    .
    .
    • 코드를 살펴보니, FBX_VARIANT 는 빌드 모드(디버그 빌드인지, 릴리즈 빌드인지)에 대해 식별하는 변수로 보이고 들어오는 Configuration은 라이브러리 이름에 대한 설정값 인 것 같다.
    • 그런데, FBX_VARIANT값을 Configuration으로 아예 덮어쓰기 해 버리니 디렉토리 위치가 제대로 나오지 않는 것 같다.
    SET(FBX_VARIANT "$(Configuration)"
    • 그러면 이제 위 코드를
    SET(FBX_VARIANT "/${FBX_VARIANT}/${Configuration}") # Configuration은 외부로부터 들어오는 값
    • 이렇게 바꿔준다면?

결과

-- Configuring done (0.1s)
  -- Generating done (0.0s)
  -- Build files have been written to: D:/FBXSDK/2020.3.4/samples/UI Examples/SceneTreeView/out/build/x64-Debug
  [0/1] Re-running CMake...
  [1/2] Building CXX object CMakeFiles\UI_Example_SceneTreeView.dir\SDK_Utility.obj
D:\FBXSDK\2020.3.4\samples\UI Examples\SceneTreeView\out\build\x64-Debug\cl : 명령줄 warning D9025: '/W3'을(를) '/W4'(으)로 재정의합니다.
  [2/2] Linking CXX executable D:\FBXSDK\2020.3.4\bin\vs2022-md\UI_Example_SceneTreeView.exe

  • Success!
profile
게임엔진코드싸개(진)

0개의 댓글