Files
space_game/shaders/CMakeLists.txt
2026-01-29 17:06:34 +01:00

107 lines
3.0 KiB
CMake

# 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})