
# Shadertoy

  

Proyecto minimal para ejecutar fragment shaders tipo Shadertoy usando SDL3 + GLAD + OpenGL 3.3.

  

![Shadertoy - Gameplay](https://php.sustancia.synology.me/images/shadertoy/shadertoy01.png)

  

## Estructura

- src/ — código fuente C++ (incluye main.cpp).

- shaders/ — shaders fragment (.frag.glsl) que se cargan en runtime.

- third_party/glad/ — glad.c + headers.

- CMakeLists.txt — configuración de build.

- .gitignore — recomendado.

  

## Requisitos

- CMake >= 3.16

- Compilador con soporte C++17

- SDL3 development headers and library

- GL loader (GLAD) incluido en third_party/glad o disponible en el sistema

  

Instalación típica:

- Debian/Ubuntu:

sudo apt install build-essential cmake libsdl3-dev

- macOS (Homebrew):

brew install cmake sdl3

  

## Build

    mkdir build
    
    cd build
    
    cmake ..
    
    cmake --build . --config Release

  

## Uso

Por defecto el ejecutable carga shaders/test.frag.glsl.

  

Ejecutar en ventana:

    ./shadertoy_sdl3 ../shaders/test.frag.glsl

  

Ejecutar en fullscreen nativo:

    ./shadertoy_sdl3 -F ../shaders/test.frag.glsl

  

Si ejecutas desde la raíz del repo:

    ./build/shadertoy_sdl3 shaders/frag_tile_iter.frag.glsl

  

Atajos en ejecución

- Escape — salir.

- F11 — alternar fullscreen desktop.

  

## Formato de shader esperado

- #version 330 core

- Debe declarar:

      uniform vec2 iResolution;

      uniform float iTime;

      in vec2 vUV;

      out vec4 FragColor;

- Función de entrada esperada (opcional, el main llama a mainImage):

      void mainImage(out vec4 fragColor, in vec2 fragCoord);

- main() debe convertir vUV a fragCoord y llamar a mainImage.

  

## Rutas y ejecución

El ejecutable intenta varias rutas relativas para localizar el shader:

- ruta tal cual pasada en argv

- ./<ruta>

- ../<ruta>

- relativo al directorio del ejecutable

  

Si obtienes "Failed to load fragment shader file", ejecuta desde la carpeta build o pasa la ruta correcta a tu shader.

  

## Multi-pass / Buffers (nota)

Ejemplo actual es single-pass. Para portar Shadertoy con BufferA/B/C necesitas:

- crear FBOs y textures por buffer

- renderizar buffers en orden y pasar las texturas como iChannelN a pases posteriores

- evitar leer y escribir la misma textura (usar ping-pong si hace falta)

  

## Troubleshooting

- SDL_Init devuelve error vacío: asegúrate que SDL3.dll (Windows) está en el mismo directorio que el ejecutable o en PATH.

- Errores de compilación/constantes: verifica que usas SDL3 headers (#include <SDL3/SDL.h>) y no SDL2.

- Shaders que fallan a compilar: revisa glGetShaderInfoLog en la salida; versiones GLSL y funciones incompatibles son la causa habitual.

  

## Licencia y créditos

- Código de ejemplo: libre para uso personal y adaptación.

- Respeta créditos de shaders copiados de Shadertoy/otros autores cuando los reutilices.