OpenXR SDK编译介绍

OpenXR 编译指南可参考:https://blog.csdn.net/geyichongchujianghu/article/details/124672713​​​​​

OpenXR SDK地址为:GitHub - KhronosGroup/OpenXR-SDK-Source: Sources for OpenXR loader, basic API layers, and example code.

Monado runtime地址为:Monado / Monado · GitLab 

system broker地址为:Ryan Pavlik / openxr-android-broker · GitLab

1. hello_xr/CMakeLists.txt

file(GLOB LOCAL_HEADERS "*.h")-- GLOB命令主要用于匹配规则在指定的目录内匹配到所需要的文件,变量存放在LOCAL_HEADERS变量中
file(GLOB LOCAL_SOURCE "*.cpp")
file(GLOB VULKAN_SHADERS "vulkan_shaders/*.glsl")

# For including compiled shaders
include_directories(${CMAKE_CURRENT_BINARY_DIR})--将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。CMAKE_CURRENT_BINARY_DIR就是当前的build目录。hello_xr/build

if(ANDROID)
    add_library(hello_xr MODULE
        ${LOCAL_SOURCE}
        ${LOCAL_HEADERS}
        ${VULKAN_SHADERS}
        $<TARGET_OBJECTS:android_native_app_glue>)--添加名为hello_xr的库,库的源文件可指定,也可用target_sources()后续指定。库的类型是STATIC(静态库)/SHARED(动态库)/MODULE(模块库)之一。
    target_link_libraries(hello_xr ${ANDROID_LIBRARY} ${ANDROID_LOG_LIBRARY})--链接给定目标和/或其依赖项时要使用的库或标志
else()
    add_executable(hello_xr
        ${LOCAL_SOURCE}
        ${LOCAL_HEADERS}
        ${VULKAN_SHADERS})--使用指定的源文件来生成目标可执行文件
endif()
set_target_properties(hello_xr PROPERTIES FOLDER ${SAMPLES_FOLDER})--这个命令是设置目标的属性,设置属性FOLDER为${SAMPLES_FOLDER}

source_group("Headers" FILES ${LOCAL_HEADERS})--任何明确指定的源文件都将放在组 <Headers> 中。相对路径是相对于当前源目录进行解释的。
source_group("Shaders" FILES ${VULKAN_SHADERS})

compile_glsl(run_hello_xr_glsl_compiles ${VULKAN_SHADERS})

add_dependencies(hello_xr
    generate_openxr_header
    run_hello_xr_glsl_compiles
)--添加依赖

target_include_directories(hello_xr
    PRIVATE
    ${PROJECT_SOURCE_DIR}/src
    ${PROJECT_SOURCE_DIR}/src/common

    # for helper headers
    ${PROJECT_SOURCE_DIR}/external/include
)--指定目标(exe或者so文件)需要包含的头文件路径。

if(GLSLANG_VALIDATOR AND NOT GLSLC_COMMAND)
    target_compile_definitions(hello_xr PRIVATE USE_GLSLANGVALIDATOR)--向target添加编译定义USE_GLSLANGVALIDATOR
endif()

if(Vulkan_FOUND)
    target_include_directories(hello_xr
        PRIVATE
        ${Vulkan_INCLUDE_DIRS}
    )
endif()

target_link_libraries(hello_xr OpenXR::openxr_loader)
if(TARGET openxr-gfxwrapper)
    target_link_libraries(hello_xr openxr-gfxwrapper)
endif()
...

2. hello_xr/build.gradle

externalNativeBuild {--用于控制Native的编译
    cmake {
        arguments '-DANDROID_STL=c++_shared',
                '-DBUILD_API_LAYERS=OFF',
                '-DBUILD_TESTS=ON',
                '-DBUILD_LOADER=ON',
                '-DBUILD_CONFORMANCE_TESTS=OFF',
                '-DBUILD_ALL_EXTENSIONS=ON'
        targets "openxr_loader", "hello_xr"
    }
}

如果要编译API_LAYER的话,则需要修改为如下:

arguments...

'-DBUILD_API_LAYERS=ON',

targets "openxr_loader", "hello_xr", "XrApiLayer_api_dump"

externalNativeBuild {--用于控制Native的编译
    cmake {
        path "${project.repoRoot}/CMakeLists.txt"--指定CMakeLists文件
        version "3.22.1"--cmake版本
    }
}

3. loader/CMakeLists.txt

由于太多,只挑重点的

# make cache variables for install destinations
include(GNUInstallDirs)--include文件夹

# List of all files externally generated outside of the loader that the loader
# needs to build with.
set(LOADER_EXTERNAL_GEN_FILES ${COMMON_GENERATED_OUTPUT})--定义变量LOADER_EXTERNAL_GEN_FILES ,并赋值为${COMMON_GENERATED_OUTPUT}
set(LOADER_EXTERNAL_GEN_DEPENDS ${COMMON_GENERATED_DEPENDS})
run_xr_xml_generate(loader_source_generator.py xr_generated_loader.hpp)--
run_xr_xml_generate(loader_source_generator.py xr_generated_loader.cpp)

add_library(openxr_loader ${LIBRARY_TYPE}
    android_utilities.cpp
    android_utilities.h
    api_layer_interface.cpp
    api_layer_interface.hpp
    loader_core.cpp
    loader_instance.cpp
    loader_instance.hpp
    loader_logger.cpp
    loader_logger.hpp
    loader_logger_recorders.cpp
    loader_logger_recorders.hpp
    manifest_file.cpp
    manifest_file.hpp
    runtime_interface.cpp
    runtime_interface.hpp
    ${GENERATED_OUTPUT}
    ${PROJECT_SOURCE_DIR}/src/common/hex_and_handles.h
    ${PROJECT_SOURCE_DIR}/src/common/object_info.cpp
    ${PROJECT_SOURCE_DIR}/src/common/object_info.h
    ${PROJECT_SOURCE_DIR}/src/common/platform_utils.hpp
    ${LOADER_EXTERNAL_GEN_FILES}
    ${openxr_loader_RESOURCE_FILE}
)--生成libopenxr_loader.so,并添加相关编译文件
set_target_properties(openxr_loader PROPERTIES FOLDER ${LOADER_FOLDER})

add_dependencies(openxr_loader generate_openxr_header xr_global_generated_files)--添加依赖
target_include_directories(
    openxr_loader
    # for OpenXR headers
    PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
           $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>

    PRIVATE ${PROJECT_SOURCE_DIR}/src/common

            # for generated dispatch table, common_config.h
            ${CMAKE_CURRENT_SOURCE_DIR}/..
            ${CMAKE_CURRENT_BINARY_DIR}/..

            # for target-specific generated files
            ${CMAKE_CURRENT_SOURCE_DIR}
            ${CMAKE_CURRENT_BINARY_DIR}
    INTERFACE $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)--指定目标(exe或者so文件)需要包含的头文件路径,需要INTERFACE、PUBLIC和PRIVATE关键字来指定以下参数的范围
target_link_libraries(
    openxr_loader
    PRIVATE ${CMAKE_DL_LIBS}
    PUBLIC Threads::Threads
)---需要链接的库
target_compile_definitions(openxr_loader PRIVATE ${OPENXR_ALL_SUPPORTED_DEFINES})--添加定义
if(ANDROID)
    target_link_libraries(
        openxr_loader
        PRIVATE
        ${ANDROID_LOG_LIBRARY}
        ${ANDROID_LIBRARY})
endif()
target_compile_definitions(openxr_loader PRIVATE API_NAME="OpenXR")--修改定义
openxr_add_filesystem_utils(openxr_loader)

set_target_properties(openxr_loader PROPERTIES DEBUG_POSTFIX "${OPENXR_DEBUG_POSTFIX}")--设置属性

...
elseif(ANDROID)
    set(JNIPP_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../external/jnipp)
    set(JNIWRAPPER_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../external/android-jni-wrappers)
    file(GLOB ANDROID_WRAP_SOURCES ${JNIWRAPPER_ROOT}/wrap/*.cpp)
    set_target_properties(openxr_loader
        PROPERTIES
        CXX_STANDARD 17
        CXX_STANDARD_REQUIRED TRUE)
    target_sources(openxr_loader
        PRIVATE
        ${CMAKE_CURRENT_SOURCE_DIR}/android_utilities.cpp
        ${CMAKE_CURRENT_SOURCE_DIR}/android_utilities.h
        ${ANDROID_WRAP_SOURCES}
        ${JNIPP_ROOT}/jnipp.cpp
    )--将源添加到target
    target_include_directories(openxr_loader
        PRIVATE
        ${JNIPP_ROOT}
        ${JNIWRAPPER_ROOT}
    )
endif()
add_library(headers INTERFACE)--直接导入已经生成的库,cmake不会给这类library添加编译规则
target_include_directories(headers INTERFACE
    $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
    $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>)
install(
    TARGETS openxr_loader headers EXPORT openxr_loader_export
    RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT Loader
    LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT Loader
    ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT Loader
)--将tunrimewe文件,库文件,头文件等安装到指定目录
export(
    EXPORT openxr_loader_export
    FILE ${CMAKE_CURRENT_BINARY_DIR}/OpenXRTargets.cmake
    NAMESPACE OpenXR::
)
# Create aliases so that it can be used the same whether vendored as source or found with CMake.
add_library(OpenXR::openxr_loader ALIAS openxr_loader)--设置库openxr_loader的别名OpenXR::openxr_loader
add_library(OpenXR::headers ALIAS headers)--设置库headers的别名OpenXR::headers

...

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity是一种强大的游戏引擎,它为开发者提供了丰富的工具和功能,用于创建虚拟现实(VR)和增强现实(AR)应用程序。而HTC Vive是一种使用虚拟现实技术的头戴式显示器,能够提供沉浸式的游戏和体验。Open XR是一个跨平台的XRARVR的统称)开放标准,旨在使开发者能够编写一次代码,然后在多个XR设备上进行部署和运行。 Unity支持HTC Vive,并通过其VR开发工具包(VR SDK)为开发者提供了与HTC Vive设备交互的功能。借助Unity和HTC Vive,开发者可以创建令人惊叹的VR游戏、模拟器和应用程序。 而Open XR提供了一个统一的API层,使开发者可以使用相同的代码来开发适用于不同XR设备的应用程序。这意味着开发者可以使用Open XR来编写适用于HTC Vive和其他XR设备的应用程序,而不需要针对每个设备编写不同的代码。 通过使用Unity和Open XR,开发者可以更加高效地开发和部署适用于多个XR设备的应用程序。这使得开发者能够更广泛地推广和分发他们的应用程序,而不受特定设备的限制。 总而言之,Unity是开发虚拟现实和增强现实应用程序的强大引擎,HTC Vive是一款用于实现沉浸式VR体验的头戴式显示器,而Open XR是一个跨平台的XR标准,使开发者能够开发适用于多个XR设备的应用程序。通过结合使用这三者,开发者能够更加高效地创造令人兴奋和创新的VRAR体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值