add_executable(HelloVulkan main.cpp) target_link_libraries(HelloVulkan PRIVATE Engine) ###### 自动构建 shader ###### find_program(GLSLC glslc REQUIRED) set(SHADER_SRC_DIR ${CMAKE_SOURCE_DIR}/shaders) set(SHADER_OUT_DIR ${CMAKE_BINARY_DIR}/bin/shaders) function(auto_compile_shader glsl_file) # glsl_file 是相对 SHADER_SRC_DIR 的路径 # 推断 stage:'.vert' -> 'vert' get_filename_component(stage ${glsl_file} EXT) string(SUBSTRING ${stage} 1 -1 stage) set(spv ${SHADER_OUT_DIR}/${glsl_file}.spv) get_filename_component(spv_dir ${spv} DIRECTORY) # 保留子目录 add_custom_command( OUTPUT ${spv} COMMAND ${CMAKE_COMMAND} -E make_directory ${spv_dir} COMMAND ${GLSLC} -fshader-stage=${stage} -o ${spv} ${SHADER_SRC_DIR}/${glsl_file} DEPENDS ${SHADER_SRC_DIR}/${glsl_file} VERBATIM) set_source_files_properties(${spv} PROPERTIES GENERATED TRUE) target_sources(${PROJECT_NAME} PRIVATE ${spv}) set_property(DIRECTORY APPEND PROPERTY HZ_SHADER_SPV_FILES ${spv}) endfunction() file(GLOB_RECURSE SHADER_SOURCES CONFIGURE_DEPENDS # 新增 shader 时自动重配 RELATIVE ${SHADER_SRC_DIR} ${SHADER_SRC_DIR}/*.vert ${SHADER_SRC_DIR}/*.frag ${SHADER_SRC_DIR}/*.comp) foreach (f ${SHADER_SOURCES}) auto_compile_shader(${f}) endforeach()