Sergio Valor fb2edd4df5 Arreglar zoom y texturas: filtro NEAREST y guardas robustas
- Añadir SDL_SetTextureScaleMode(render_texture_, SDL_SCALEMODE_NEAREST) para pixel-perfect
- Implementar sistema de fallback robusto para detección de display
- Restaurar funcionalidad completa de zoom con centrado y guardas
- Las texturas ahora se ven pixel-perfect sin blur
- El zoom respeta límites del escritorio correctamente

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-28 08:28:13 +02:00

ViBe4 Shaders - Renderizado Acelerado con Efectos CRT

ViBe4 Shaders es una demo experimental de vibe-coding que implementa renderizado acelerado multi-backend con efectos de shader CRT. Utiliza OpenGL, Vulkan y Metal para demostrar diferentes tecnologías de renderizado con shaders que simulan pantallas CRT clásicas.

El nombre refleja su propósito: ViBe (vibe-coding experimental) + Shaders (efectos visuales con shaders CRT). La demo sirve como sandbox para probar diferentes backends de renderizado y experimentar con shaders de post-procesado para efectos retro.

🎯 Características Actuales

  • Arquitectura multi-backend: Sistema modular con detección automática de plataforma
  • Renderizado acelerado: Metal (macOS), Vulkan (Windows/Linux), SDL (fallback)
  • Efectos CRT en tiempo real: Scanlines, curvatura, bloom y máscaras de color configurables
  • WindowManager inteligente: Gestión automática de ventana y selección de backend
  • Sistema de temas visuales: 5 temas de colores con fondos degradados y paletas temáticas
  • Sistema de zoom dinámico: F1/F2 para ajustar el zoom de ventana (1x-10x)
  • Modos fullscreen: F3 para fullscreen normal, F4 para real fullscreen con resolución nativa
  • Gravedad multidireccional: Gravedad hacia abajo, arriba, izquierda o derecha
  • Controles CRT interactivos: Ajuste en tiempo real de efectos con teclas dedicadas
  • Renderizado batch optimizado: Sistema de batch rendering unificado para todos los backends
  • Colores temáticos: Paletas de 8 colores por tema aplicadas proceduralmente
  • Monitor de rendimiento: Contador FPS en tiempo real e información de backend
  • Control V-Sync: Activación/desactivación dinámica del V-Sync
  • Post-procesado avanzado: Pipeline multi-pass para efectos CRT profesionales

🎮 Controles

Controles de Sistema

Tecla Acción
H Alternar debug display (FPS, V-Sync, valores renderizado)
V Alternar V-Sync ON/OFF
ESC Salir del programa

Controles de Ventana

Tecla Acción
F1 Zoom out (reducir zoom ventana)
F2 Zoom in (aumentar zoom ventana)
F3 Toggle fullscreen normal
F4 Toggle real fullscreen (resolución nativa)

Controles de Temas

Tecla Acción
KP_1 Tema ATARDECER (colores cálidos)
KP_2 Tema OCÉANO (azules y cianes)
KP_3 Tema NEON (colores vibrantes)
KP_4 Tema BOSQUE (verdes naturales)
KP_5 Tema RGB (fondo blanco, colores matemáticos)
T Ciclar entre todos los temas

Controles de Simulación

Tecla Acción
1-8 Cambiar número de sprites (1, 10, 100, 500, 1K, 10K, 50K, 100K)
ESPACIO Impulsar todos los sprites hacia arriba
Gravedad hacia ARRIBA
Gravedad hacia ABAJO
Gravedad hacia IZQUIERDA
Gravedad hacia DERECHA
G Alternar gravedad ON/OFF (mantiene dirección)

Controles de Shaders

Tecla Acción
R Cambiar backend de renderizado (OpenGL/Vulkan/Metal)
C Alternar efectos CRT ON/OFF
S Ajustar intensidad de scanlines
B Controlar efecto bloom
U Modificar curvatura de pantalla

📊 Información en Pantalla

  • Centro: Número de sprites activos en blanco (temporal)
  • Centro: Nombre del tema activo en color temático (temporal, debajo del contador)

Debug Display (Tecla H)

Cuando se activa el debug display con la tecla H:

  • Esquina superior izquierda: Estado V-Sync (VSYNC ON/OFF) en cian
  • Esquina superior derecha: Contador FPS en tiempo real en amarillo
  • Líneas 3-5: Información de backend de renderizado (BACKEND: Metal/Vulkan/SDL, CRT: ON/OFF) en magenta
  • Línea 6: Tema activo (THEME SUNSET/OCEAN/NEON/FOREST/RGB) en amarillo claro

🏗️ Arquitectura Multi-Backend

Detección Automática de Plataforma

ViBe4 Shaders implementa un sistema inteligente que selecciona automáticamente el mejor backend de renderizado según la plataforma:

Plataforma Backend Seleccionado Razón
macOS Metal API nativo optimizado para Apple Silicon/Intel
Windows Vulkan Máximo rendimiento multiplataforma
Linux Vulkan API moderno con soporte para compute shaders
Fallback SDL Compatibilidad universal cuando otros fallan

Componentes del Sistema

1. WindowManager

  • Detección automática: Identifica la plataforma y selecciona el backend óptimo
  • Gestión de ventana: Controla SDL_Window, zoom, fullscreen y eventos
  • Interfaz unificada: Abstrae las diferencias entre backends para el Engine

2. RendererInterface

  • Abstracción común: Interfaz que implementan todos los backends
  • Efectos CRT: Parámetros unificados para scanlines, curvatura, bloom
  • Batch rendering: Sistema de sprites optimizado para renderizado masivo

3. Backends Específicos

SDLRenderer (Fallback)

  • Renderizado usando SDL_RenderGeometry
  • Efectos CRT simulados en CPU
  • Compatible con cualquier plataforma
  • Rendimiento: >75 FPS con 50K sprites

MetalRenderer (macOS)

  • API Metal nativo para máximo rendimiento
  • Command buffers asíncronos optimizados
  • Metal Shading Language (MSL) para shaders
  • Soporte para Apple Silicon y Intel

VulkanRenderer (Windows/Linux)

  • API Vulkan para control directo de GPU
  • Compute shaders para post-procesado paralelo
  • SPIR-V shaders compilados
  • Máximo rendimiento en hardware moderno

Pipeline de Renderizado

graph TD
    A[Engine] --> B[WindowManager]
    B --> C{Detectar Plataforma}
    C -->|macOS| D[MetalRenderer]
    C -->|Windows/Linux| E[VulkanRenderer]
    C -->|Fallback| F[SDLRenderer]
    D --> G[Efectos CRT]
    E --> G
    F --> G
    G --> H[Presentación]

Flujo de Inicialización

  1. Engine::initialize()

    • Crea WindowManager único
    • Configura parámetros CRT iniciales
  2. WindowManager::initialize()

    • Detecta plataforma automáticamente
    • Crea ventana SDL con flags apropiados
    • Instancia el backend correspondiente
  3. Backend::initialize()

    • Configura recursos específicos (Metal device, Vulkan instance, etc.)
    • Crea pipelines de renderizado
    • Inicializa buffers y texturas
  4. Configuración CRT

    • Aplica parámetros iniciales al backend
    • Configura V-Sync según preferencias
    • Prepara sistema para renderizado

🎨 Sistema de Temas de Colores

ViBe4 Shaders incluye 5 temas visuales que transforman completamente la apariencia de la demo:

Temas Disponibles

Tecla Tema Descripción Fondo Paleta de Sprites
KP_1 ATARDECER Colores cálidos de puesta de sol Degradado naranja-rojo Tonos naranjas, rojos y amarillos
KP_2 OCÉANO Ambiente marino refrescante Degradado azul-cian Azules, cianes y verdes agua
KP_3 NEON Colores vibrantes futuristas Degradado magenta-cian Magentas, cianes y rosas brillantes
KP_4 BOSQUE Naturaleza verde relajante Degradado verde oscuro-claro Verdes naturales y tierra
KP_5 RGB Colores matemáticos puros Fondo blanco sólido RGB puros y subdivisiones matemáticas

Controles de Temas

  • Selección directa: Usa KP_1, KP_2, KP_3, KP_4 o KP_5 para cambiar inmediatamente al tema deseado
  • Ciclado secuencial: Presiona T para avanzar al siguiente tema en orden
  • Indicador visual: El nombre del tema aparece temporalmente en el centro de la pantalla con colores temáticos
  • Regeneración automática: Los sprites adoptan automáticamente la nueva paleta de colores al cambiar tema

Detalles Técnicos

  • Fondos degradados: Implementados con renderizado de geometría usando vértices con colores interpolados
  • Paletas temáticas: 8 colores únicos por tema aplicados aleatoriamente a los sprites
  • Rendimiento optimizado: El cambio de tema solo regenera los colores, manteniendo la simulación
  • Compatibilidad completa: Funciona con todos los backends de renderizado

🎮 Backends de Renderizado

OpenGL Backend

  • Vertex/Fragment Shaders: Shaders GLSL para efectos CRT
  • Framebuffer Objects: Para post-procesado multi-pass
  • Uniform Buffer Objects: Transferencia eficiente de parámetros de shader

Vulkan Backend

  • Compute Shaders: Para efectos de post-procesado paralelos
  • Render Passes: Pipeline de renderizado optimizado
  • Descriptor Sets: Gestión eficiente de recursos de GPU

Metal Backend (macOS)

  • Metal Shading Language: Shaders nativos para Apple Silicon
  • Command Buffers: Renderizado asíncrono optimizado
  • Metal Performance Shaders: Efectos CRT acelerados por hardware

🖥️ Efectos CRT

Scanlines

  • Intensidad ajustable: Control dinámico de la intensidad de las líneas de escaneo
  • Frecuencia configurable: Diferentes densidades de scanlines
  • Interpolación temporal: Efectos de persistencia de fósforo

Curvatura de Pantalla

  • Distorsión barrel: Simulación de curvatura de monitores CRT
  • Aberración cromática: Separación de colores en los bordes
  • Vignetting: Oscurecimiento gradual hacia los bordes

Bloom y Ghosting

  • Bloom HDR: Resplandor realista de píxeles brillantes
  • Ghosting temporal: Persistencia de imagen característica de CRT
  • Color bleeding: Sangrado de colores entre píxeles adyacentes

🏗️ Estructura del Proyecto

vibe4_shaders/
├── source/
│   ├── main.cpp              # Punto de entrada del programa
│   ├── engine.h/cpp          # Lógica de juego y coordinación de sistemas
│   ├── window_manager.h/cpp  # 🆕 Gestión de ventana y selección de backend
│   ├── ball.h/cpp            # Clase Ball - entidades físicas de la demo
│   ├── defines.h             # Constantes y configuración global
│   ├── backends/             # 🆕 Sistema de renderizado multi-backend
│   │   ├── renderer_interface.h    # Interfaz común para todos los backends
│   │   ├── sdl_renderer.h/cpp      # Backend SDL (fallback universal)
│   │   ├── metal_renderer.h/cpp    # Backend Metal (macOS nativo)
│   │   └── vulkan_renderer.h/cpp   # Backend Vulkan (Windows/Linux)
│   └── external/             # Utilidades y bibliotecas externas
│       ├── sprite.h/cpp          # Clase Sprite - renderizado de texturas
│       ├── texture.h/cpp         # Clase Texture - gestión de imágenes
│       ├── dbgtxt.h              # Sistema de debug para texto en pantalla
│       └── stb_image.h           # Biblioteca para cargar imágenes
├── shaders/                  # 📁 Directorio para futuros shaders
│   ├── opengl/               # Shaders GLSL (planeado)
│   │   ├── crt.vert              # Vertex shader CRT
│   │   ├── crt.frag              # Fragment shader CRT
│   │   └── post.frag             # Post-procesado
│   ├── vulkan/               # Shaders SPIR-V (planeado)
│   │   ├── crt.vert.spv          # Vertex shader compilado
│   │   ├── crt.frag.spv          # Fragment shader compilado
│   │   └── compute.comp.spv      # Compute shader CRT
│   └── metal/                # Shaders Metal (planeado)
│       ├── crt.metal             # Shaders Metal para CRT
│       └── post.metal            # Post-procesado Metal
├── data/
│   ├── ball.png              # Textura del sprite (10x10 píxeles)
│   └── crtpi_240.glsl        # Shader CRT de referencia
├── build/                    # Directorio de compilación (generado)
├── CMakeLists.txt            # Configuración de CMake
├── .gitignore               # Archivos ignorados por Git
└── README.md                # Este archivo

Componentes Clave del Sistema

🎮 Engine (engine.h/cpp)

  • Coordinador principal: Maneja lógica de juego, timing y eventos
  • Gestión de efectos CRT: Controla parámetros de scanlines, curvatura, bloom
  • Interfaz de usuario: Procesa controles de teclado y eventos SDL
  • Física: Actualiza simulación con delta time independiente del framerate

🪟 WindowManager (window_manager.h/cpp)

  • Detección automática: Selecciona el mejor backend según la plataforma
  • Gestión de ventana: Controla SDL_Window, fullscreen, zoom dinámico
  • Abstracción de backend: Proporciona interfaz unificada al Engine
  • Configuración: Maneja V-Sync, resolución y modos de pantalla

🎨 Sistema de Backends (backends/)

  • RendererInterface: Define contrato común para todos los backends
  • SDLRenderer: Implementación fallback con efectos CRT simulados
  • MetalRenderer: Backend nativo macOS con Metal API
  • VulkanRenderer: Backend de alto rendimiento para Windows/Linux

🔧 Requisitos del Sistema

  • SDL3 (Simple DirectMedia Layer 3)
  • C++20 compatible compiler
  • CMake 3.20+ o Make
  • OpenGL 4.1+ (para backend OpenGL)
  • Vulkan 1.2+ (para backend Vulkan)
  • Metal 2.0+ (para backend Metal en macOS)
  • Plataforma: Windows, Linux, macOS

Instalación de Dependencias

Windows (MinGW)

# SDL3 + Vulkan SDK
vcpkg install sdl3 vulkan

Linux

# Ubuntu/Debian
sudo apt install libsdl3-dev vulkan-tools libvulkan-dev
# Arch Linux
sudo pacman -S sdl3 vulkan-devel

macOS

brew install sdl3
# Metal viene incluido en Xcode

🚀 Compilación

Opción 1: CMake (Recomendado)

mkdir build && cd build
cmake -DBACKEND=AUTO ..  # AUTO, OPENGL, VULKAN, METAL
make

Opción 2: Make directo

make BACKEND=opengl  # opengl, vulkan, metal

▶️ Ejecución

# Desde la raíz del proyecto
./vibe4_shaders        # Linux/macOS
./vibe4_shaders.exe    # Windows

# Con argumentos
./vibe4_shaders --backend vulkan --crt-effects

📊 Detalles Técnicos

Configuración Actual

  • Resolución: 320x240 píxeles (escalado x3 = 960x720)
  • Sistema de timing: Delta time independiente del framerate
  • Renderizado: Batch rendering acelerado por GPU
  • Tamaño de sprite: 10x10 píxeles
  • V-Sync: Activado por defecto, controlable dinámicamente

Arquitectura del Renderizado

  1. engine.cpp: Motor de renderizado multi-backend:

    • Abstracción de OpenGL/Vulkan/Metal
    • Sistema de shaders unificado
    • Pipeline de post-procesado CRT
  2. main.cpp: Bucle principal con cuatro fases:

    • calculateDeltaTime(): Calcula tiempo transcurrido entre frames
    • update(): Actualiza la lógica de simulación
    • checkEvents(): Procesa eventos de entrada
    • render(): Renderiza escena + efectos CRT + overlays
  3. Ball: Entidades de la demo con física independiente de timing

  4. Sprite: Sistema de renderizado de texturas con filtro nearest neighbor

🎨 Desarrollo de Shaders

Estructura de Shaders CRT

// Fragment shader CRT (GLSL)
uniform float scanline_intensity;
uniform float curvature_amount;
uniform vec2 screen_resolution;

vec2 crt_coords(vec2 uv) {
    // Aplicar curvatura tipo barril
    uv = uv * 2.0 - 1.0;
    uv *= 1.0 + curvature_amount * dot(uv, uv);
    return (uv + 1.0) * 0.5;
}

vec3 apply_scanlines(vec3 color, vec2 screen_pos) {
    float scanline = sin(screen_pos.y * screen_resolution.y * 3.14159 * 2.0);
    scanline = scanline_intensity + (1.0 - scanline_intensity) * scanline;
    return color * scanline;
}

Pipeline de Post-Procesado

  1. Render Pass 1: Renderizar escena a framebuffer
  2. Render Pass 2: Aplicar curvatura y distorsión
  3. Render Pass 3: Añadir scanlines y efectos temporales
  4. Render Pass 4: Bloom y color bleeding
  5. Final: Composición final a pantalla

Sistema de Delta Time (COMPLETADO)

El sistema mantiene la implementación de delta time del proyecto anterior, garantizando:

  • Velocidad consistente entre diferentes refresh rates
  • V-Sync independiente: misma velocidad con V-Sync ON/OFF
  • Física precisa: movimiento calculado correctamente
  • Escalabilidad: preparado para renderizado masivo
  • Debug en tiempo real: monitoreo de valores de renderizado

🚀 Sistema de Batch Rendering Acelerado

Arquitectura del Batch por GPU

El sistema utiliza buffers de geometría para renderizado masivo:

// Recopilar datos de geometría
for (auto &sprite : sprites) {
    addSpriteToGPUBatch(sprite.getTransform(), sprite.getColor());
}

// Renderizar con backend seleccionado
switch(current_backend) {
    case OPENGL: renderWithOpenGL(); break;
    case VULKAN: renderWithVulkan(); break;
    case METAL:  renderWithMetal(); break;
}

Rendimiento Multi-Backend

  • OpenGL: >75 FPS con 50,000 sprites + efectos CRT
  • Vulkan: >90 FPS con 100,000 sprites + compute shaders
  • Metal: >85 FPS con 75,000 sprites + MSL optimizado

🛠️ Desarrollo

Para contribuir al proyecto:

  1. Fork del repositorio
  2. Crear rama de feature (git checkout -b feature/nuevo-shader)
  3. Desarrollar shaders en directorio correspondiente
  4. Commit de cambios (git commit -am 'Añadir shader CRT mejorado')
  5. Push a la rama (git push origin feature/nuevo-shader)
  6. Crear Pull Request

Añadir Nuevos Efectos CRT

  1. Implementar en todos los backends: OpenGL (GLSL), Vulkan (SPIR-V), Metal (MSL)
  2. Añadir controles: Teclas para activar/configurar el efecto
  3. Documentar parámetros: Uniforms y configuración del shader
  4. Probar rendimiento: Verificar FPS en diferentes escenarios

📝 Notas Técnicas

  • Smart pointers (unique_ptr, shared_ptr) para gestión de memoria
  • RAII para recursos de GPU (buffers, texturas, pipelines)
  • Separación de backends con interfaz común
  • Configuración multiplataforma (Windows, Linux, macOS)
  • Hot-reload de shaders en modo debug
  • Perfilado de GPU integrado

🐛 Problemas Conocidos

  • Vulkan: Validación layers pueden reducir rendimiento en debug
  • Metal: Requiere macOS 10.13+ para todas las características
  • Shaders: Hot-reload no disponible en modo release

Proyecto desarrollado como base para experimentación con tecnologías de renderizado modernas, shaders CRT y efectos de post-procesado en tiempo real.

Description
No description provided
Readme 216 KiB
Languages
C++ 88.8%
GLSL 6.6%
Objective-C 3%
CMake 1.6%