feat(shaders): sistema de shaders runtime amb presets externs

- Afegir GpuShaderPreset i ShaderManager per carregar shaders des de data/shaders/
- Implementar preset ntsc-md-rainbows (2 passos: encode + decode MAME NTSC)
- Render loop multi-pass per shaders externs (targets intermedis R16G16B16A16_FLOAT)
- cycleShader(): cicla OFF→PostFX natius→shaders externs amb tecla X
- --shader <nom> per arrancar directament amb un preset extern
- CMake auto-descubreix i compila data/shaders/**/*.vert/.frag → .spv
- HUD F1 mostra 'Shader: <nom>' quan hi ha shader extern actiu

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-20 13:37:22 +01:00
parent e3f29c864b
commit f272bab296
19 changed files with 1004 additions and 23 deletions

View File

@@ -64,6 +64,34 @@ if(NOT APPLE)
endforeach()
add_custom_target(shaders ALL DEPENDS ${SPIRV_HEADERS})
# External runtime shaders: auto-discover and compile data/shaders/**/*.vert/*.frag
# Output: <source>.spv alongside each source file (loaded at runtime by GpuShaderPreset)
file(GLOB_RECURSE DATA_SHADERS
"${CMAKE_SOURCE_DIR}/data/shaders/**/*.vert"
"${CMAKE_SOURCE_DIR}/data/shaders/**/*.frag")
set(DATA_SHADER_SPVS)
foreach(SHADER_FILE ${DATA_SHADERS})
get_filename_component(SHADER_EXT "${SHADER_FILE}" EXT)
if(SHADER_EXT STREQUAL ".vert")
set(STAGE_FLAG "-fshader-stage=vertex")
else()
set(STAGE_FLAG "-fshader-stage=fragment")
endif()
set(SPV_FILE "${SHADER_FILE}.spv")
add_custom_command(
OUTPUT "${SPV_FILE}"
COMMAND "${GLSLC}" ${STAGE_FLAG} -o "${SPV_FILE}" "${SHADER_FILE}"
DEPENDS "${SHADER_FILE}"
COMMENT "Compiling ${SHADER_FILE}"
)
list(APPEND DATA_SHADER_SPVS "${SPV_FILE}")
endforeach()
if(DATA_SHADER_SPVS)
add_custom_target(data_shaders ALL DEPENDS ${DATA_SHADER_SPVS})
endif()
endif()
# Archivos fuente (excluir main_old.cpp)
@@ -105,6 +133,9 @@ target_link_libraries(${PROJECT_NAME} ${LINK_LIBS})
if(NOT APPLE)
add_dependencies(${PROJECT_NAME} shaders)
target_include_directories(${PROJECT_NAME} PRIVATE "${SHADER_GEN_DIR}")
if(TARGET data_shaders)
add_dependencies(${PROJECT_NAME} data_shaders)
endif()
endif()
# Tool: pack_resources