# Ref.: https://stackoverflow.com/questions/67040258/cmake-compile-glsl-shaders # Ref.: https://cmake.org/cmake/help/latest/command/add_custom_command.html set(SHADER_SOURCE_DIR ${PROJECT_SOURCE_DIR}/shaders) set(SHADER_BIN_DIR ${PROJECT_SOURCE_DIR}/assets/shaders) file(GLOB VERTEX_SHADERS ${SHADER_SOURCE_DIR}/vs_*.sc) file(GLOB FRAGMENT_SHADERS ${SHADER_SOURCE_DIR}/fs_*.sc) file(GLOB COMPUTE_SHADERS ${SHADER_SOURCE_DIR}/cs_*.sc) # vertex shaders foreach(SHADER_IN IN LISTS VERTEX_SHADERS) cmake_path(GET SHADER_IN FILENAME SHADER_NAME) # ex. SHADER_NAME==vs_cubes.sc # output file string(REPLACE ".sc" ".spv" SHADER_OUT ${SHADER_NAME}) set(SHADER_OUT ${SHADER_BIN_DIR}/${SHADER_OUT}) # varying file string(REPLACE "vs" "varying" SHADER_VARYING ${SHADER_IN}) # message("SHADER_IN: " ${SHADER_IN} " - SHADER_VARYING: " ${SHADER_VARYING} " - SHADER_OUT: " ${SHADER_OUT}) _bgfx_shaderc_parse(CLI FILE ${SHADER_IN} OUTPUT ${SHADER_OUT} VERTEX LINUX PROFILE spirv VARYINGDEF ${SHADER_VARYING} INCLUDES ${SHADER_BIN_DIR} ) add_custom_command( OUTPUT ${SHADER_OUT} COMMAND ${SHADERC} ${CLI} DEPENDS ${SHADER_IN} COMMENT "Compiling shader ${SHADER_NAME}" ) list(APPEND SPV_SHADERS ${SHADER_OUT}) endforeach() # fragment shaders foreach(SHADER_IN IN LISTS FRAGMENT_SHADERS) cmake_path(GET SHADER_IN FILENAME SHADER_NAME) # ex. SHADER_NAME==vs_cubes.sc # output file string(REPLACE ".sc" ".spv" SHADER_OUT ${SHADER_NAME}) set(SHADER_OUT ${SHADER_BIN_DIR}/${SHADER_OUT}) # varying file string(REPLACE "fs" "varying" SHADER_VARYING ${SHADER_IN}) # message("SHADER_IN: " ${SHADER_IN} " - SHADER_VARYING: " ${SHADER_VARYING} " - SHADER_OUT: " ${SHADER_OUT}) _bgfx_shaderc_parse(CLI FILE ${SHADER_IN} OUTPUT ${SHADER_OUT} FRAGMENT LINUX PROFILE spirv VARYINGDEF ${SHADER_VARYING} INCLUDES ${SHADER_BIN_DIR} ) add_custom_command( OUTPUT ${SHADER_OUT} COMMAND ${SHADERC} ${CLI} DEPENDS ${SHADER_IN} COMMENT "Compiling shader ${SHADER_NAME}" ) list(APPEND SPV_SHADERS ${SHADER_OUT}) endforeach() # compute shaders foreach(SHADER_IN IN LISTS COMPUTE_SHADERS) cmake_path(GET SHADER_IN FILENAME SHADER_NAME) # ex. SHADER_NAME==vs_cubes.sc # output file string(REPLACE ".sc" ".spv" SHADER_OUT ${SHADER_NAME}) set(SHADER_OUT ${SHADER_BIN_DIR}/${SHADER_OUT}) # message("SHADER_IN: " ${SHADER_IN} " - "SHADER_OUT: " ${SHADER_OUT}) _bgfx_shaderc_parse(CLI FILE ${SHADER_IN} OUTPUT ${SHADER_OUT} COMPUTE LINUX PROFILE spirv INCLUDES ${SHADER_BIN_DIR} ) add_custom_command( OUTPUT ${SHADER_OUT} COMMAND ${SHADERC} ${CLI} DEPENDS ${SHADER_IN} COMMENT "Compiling shader ${SHADER_NAME}" ) list(APPEND SPV_SHADERS ${SHADER_OUT}) endforeach() add_custom_target(shaders ALL DEPENDS ${SPV_SHADERS})