新增自动化编译shader
This commit is contained in:
parent
b359240bb1
commit
fbb01724a4
@ -56,6 +56,41 @@ function(retrieve_files out_files)
|
|||||||
set(${out_files} ${RESULT} PARENT_SCOPE)
|
set(${out_files} ${RESULT} PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
set(SHADER_CPP_GENERATED_CMAKE "${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateShaderCPPFile.cmake" CACHE STRING "" FORCE)
|
||||||
|
|
||||||
|
function(compile_shader TARGET_NAME OUTPUT SHADER_INCLUDE_DIR)
|
||||||
|
set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
set(GLSLANG_BIN $ENV{VULKAN_SDK}/Bin/glslangValidator.exe) # 设置glslangValidator的位置
|
||||||
|
set(ALL_SHADER_FILE "")
|
||||||
|
# get files in SHADER_INCLUDE_DIR
|
||||||
|
file(GLOB_RECURSE ALL_SHADER_FILE "${SHADER_INCLUDE_DIR}/*.vert" "${SHADER_INCLUDE_DIR}/*.frag" "${SHADER_INCLUDE_DIR}/*.comp" "${SHADER_INCLUDE_DIR}/*.tesc" "${SHADER_INCLUDE_DIR}/*.tese" "${SHADER_INCLUDE_DIR}/*.geom")
|
||||||
|
|
||||||
|
|
||||||
|
foreach(SHADER ${ALL_SHADER_FILE}) # 遍历每一个shader源文件
|
||||||
|
get_filename_component(SHADER_NAME ${SHADER} NAME) # 获取shader的名字
|
||||||
|
string(REPLACE "." "_" HEADER_NAME ${SHADER_NAME}) # 在生成的.h文件中将文件名的'.'换成'_'
|
||||||
|
string(TOUPPER ${HEADER_NAME} GLOBAL_SHADER_VAR) # 将存储二进制内容的全局vector对象名改为全部大写
|
||||||
|
set(SPV_FILE "${OUTPUT}/spv/${SHADER_NAME}.spv") # 生成的.spv文件
|
||||||
|
set(CPP_FILE "${OUTPUT}/cpp/${HEADER_NAME}.h") # 生成的.h文件
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${SPV_FILE}
|
||||||
|
COMMAND ${GLSLANG_BIN} -I${SHADER_INCLUDE_DIR} -V100 -o ${SPV_FILE} ${SHADER}
|
||||||
|
DEPENDS ${SHADER}
|
||||||
|
WORKING_DIRECTORY "${working_dir}") # 添加编译命令,在项目生成时执行
|
||||||
|
list(APPEND ALL_GENERATED_SPV_FILES ${SPV_FILE})
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT ${CPP_FILE}
|
||||||
|
COMMAND ${CMAKE_COMMAND} -DPATH=${SPV_FILE} -DHEADER="${CPP_FILE}"
|
||||||
|
-DGLOBAL="${GLOBAL_SHADER_VAR}" -P "${SHADER_CPP_GENERATED_CMAKE}"
|
||||||
|
DEPENDS ${SPV_FILE}
|
||||||
|
WORKING_DIRECTORY "${working_dir}") # 添加执行将spv转换为h文件的cmake函数的命令
|
||||||
|
list(APPEND ALL_GENERATED_CPP_FILES ${CPP_FILE})
|
||||||
|
endforeach()
|
||||||
|
add_custom_target(${TARGET_NAME} # 将上述过程添加到一个生成目标中
|
||||||
|
DEPENDS ${ALL_GENERATED_SPV_FILES} ${ALL_GENERATED_CPP_FILES} SOURCES ${SHADERS})
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
add_subdirectory(core)
|
add_subdirectory(core)
|
||||||
add_subdirectory(third_party/imgui)
|
add_subdirectory(third_party/imgui)
|
||||||
add_subdirectory(third_party/portaudio)
|
add_subdirectory(third_party/portaudio)
|
||||||
|
25
cmake/GenerateShaderCPPFile.cmake
Normal file
25
cmake/GenerateShaderCPPFile.cmake
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
function(embed_resource resource_file_name source_file_name variable_name)
|
||||||
|
if(EXISTS "${source_file_name}")
|
||||||
|
if("${source_file_name}" IS_NEWER_THAN "${resource_file_name}")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
if(EXISTS "${resource_file_name}")
|
||||||
|
file(REMOVE "${source_file_name}")
|
||||||
|
file(READ "${resource_file_name}" hex_content HEX)
|
||||||
|
string(REPEAT "[0-9a-f]" 32 pattern)
|
||||||
|
string(REGEX REPLACE "(${pattern})" "\\1\n" content "${hex_content}")
|
||||||
|
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " content "${content}")
|
||||||
|
string(REGEX REPLACE ", $" "" content "${content}")
|
||||||
|
set(array_definition "static const uint8_t ${variable_name} []=\n{\n${content}\n};")
|
||||||
|
get_filename_component(file_name ${source_file_name} NAME)
|
||||||
|
set(source "#pragma once\n/**\n * @file ${file_name}\n * @brief Auto generated file.\n */\n${array_definition}\n")
|
||||||
|
file(WRITE "${source_file_name}" "${source}")
|
||||||
|
else()
|
||||||
|
message("ERROR: ${resource_file_name} doesn't exist")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
if(EXISTS "${PATH}")
|
||||||
|
embed_resource("${PATH}" "${HEADER}" "${GLOBAL}")
|
||||||
|
endif()
|
@ -15,59 +15,3 @@ target_link_libraries(${PROJECT_NAME} PUBLIC imgui spdlog glfw)
|
|||||||
|
|
||||||
target_precompile_headers(${PROJECT_NAME} PUBLIC extern.h)
|
target_precompile_headers(${PROJECT_NAME} PUBLIC extern.h)
|
||||||
add_definitions(-Dcore_EXPORTS -DSTB_IMAGE_IMPLEMENTATION -DSTBI_WINDOWS_UTF8)
|
add_definitions(-Dcore_EXPORTS -DSTB_IMAGE_IMPLEMENTATION -DSTBI_WINDOWS_UTF8)
|
||||||
|
|
||||||
function(compile_shader TARGET_NAME OUTPUT SHADER_INCLUDE_DIR)
|
|
||||||
set(working_dir "${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
set(GLSLANG_BIN $ENV{VULKAN_SDK}/Bin/glslangValidator.exe) # 设置glslangValidator的位置
|
|
||||||
set(ALL_SHADER_FILE "")
|
|
||||||
# get files in SHADER_INCLUDE_DIR
|
|
||||||
file(GLOB_RECURSE ALL_SHADER_FILE "${SHADER_INCLUDE_DIR}/*.vert" "${SHADER_INCLUDE_DIR}/*.frag" "${SHADER_INCLUDE_DIR}/*.comp" "${SHADER_INCLUDE_DIR}/*.tesc" "${SHADER_INCLUDE_DIR}/*.tese" "${SHADER_INCLUDE_DIR}/*.geom")
|
|
||||||
|
|
||||||
foreach(SHADER ${ALL_SHADER_FILE}) # 遍历每一个shader源文件
|
|
||||||
get_filename_component(SHADER_NAME ${SHADER} NAME) # 获取shader的名字
|
|
||||||
string(REPLACE "." "_" HEADER_NAME ${SHADER_NAME}) # 在生成的.h文件中将文件名的'.'换成'_'
|
|
||||||
string(TOUPPER ${HEADER_NAME} GLOBAL_SHADER_VAR) # 将存储二进制内容的全局vector对象名改为全部大写
|
|
||||||
set(SPV_FILE "${OUTPUT}/spv/${SHADER_NAME}.spv") # 生成的.spv文件
|
|
||||||
set(CPP_FILE "${OUTPUT}/cpp/${HEADER_NAME}.h") # 生成的.h文件
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${SPV_FILE}
|
|
||||||
COMMAND ${GLSLANG_BIN} -I${SHADER_INCLUDE_DIR} -V100 -o ${SPV_FILE} ${SHADER}
|
|
||||||
DEPENDS ${SHADER}
|
|
||||||
WORKING_DIRECTORY "${working_dir}") # 添加编译命令,在项目生成时执行
|
|
||||||
list(APPEND ALL_GENERATED_SPV_FILES ${SPV_FILE})
|
|
||||||
add_custom_command(
|
|
||||||
OUTPUT ${CPP_FILE}
|
|
||||||
COMMAND ${CMAKE_COMMAND} -DPATH=${SPV_FILE} -DHEADER="${CPP_FILE}"
|
|
||||||
-DGLOBAL="${GLOBAL_SHADER_VAR}" -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/GenerateShaderCPPFile.cmake"
|
|
||||||
DEPENDS ${SPV_FILE}
|
|
||||||
WORKING_DIRECTORY "${working_dir}") # 添加执行将spv转换为h文件的cmake函数的命令
|
|
||||||
list(APPEND ALL_GENERATED_CPP_FILES ${CPP_FILE})
|
|
||||||
endforeach()
|
|
||||||
add_custom_target(${TARGET_NAME} # 将上述过程添加到一个生成目标中
|
|
||||||
DEPENDS ${ALL_GENERATED_SPV_FILES} ${ALL_GENERATED_CPP_FILES} SOURCES ${SHADERS})
|
|
||||||
endfunction()
|
|
||||||
# GenerateShaderCPPFile.cmake
|
|
||||||
function(embed_resource resource_file_name source_file_name variable_name)
|
|
||||||
if(EXISTS "${source_file_name}")
|
|
||||||
if("${source_file_name}" IS_NEWER_THAN "${resource_file_name}")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
if(EXISTS "${resource_file_name}")
|
|
||||||
file(READ "${resource_file_name}" hex_content HEX)
|
|
||||||
string(REPEAT "[0-9a-f]" 32 pattern)
|
|
||||||
string(REGEX REPLACE "(${pattern})" "\\1\n" content "${hex_content}")
|
|
||||||
string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1, " content "${content}")
|
|
||||||
string(REGEX REPLACE ", $" "" content "${content}")
|
|
||||||
set(array_definition "static const std::vector<unsigned char> ${variable_name} =\n{\n${content}\n};")
|
|
||||||
get_filename_component(file_name ${source_file_name} NAME)
|
|
||||||
set(source "/**\n * @file ${file_name}\n * @brief Auto generated file.\n */\n#include <vector>\n${array_definition}\n")
|
|
||||||
file(WRITE "${source_file_name}" "${source}")
|
|
||||||
else()
|
|
||||||
message("ERROR: ${resource_file_name} doesn't exist")
|
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
endfunction()
|
|
||||||
if(EXISTS "${PATH}")
|
|
||||||
embed_resource("${PATH}" "${HEADER}" "${GLOBAL}")
|
|
||||||
endif()
|
|
Loading…
x
Reference in New Issue
Block a user