Remove voxel_descent shader, add cube_lines shader, update README
- Removed voxel_descent.frag.glsl (incompatible with OpenGL - multiple overflow issues) - Added cube_lines.frag.glsl by Danil (raytraced refraction cube with self-intersections) - Updated README.md: - Corrected executable name (shadertoy_sdl3 → shadertoy) - Added features section (FPS counter, VSync, metadata, feedback system) - Updated keyboard shortcuts (F3, F4, arrows) - Added Shadertoy compatibility guide - Updated usage examples with correct paths - Added shader conversion guide from Shadertoy 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
133
README.md
133
README.md
@@ -1,27 +1,37 @@
|
||||
|
||||
# Shadertoy
|
||||
|
||||
|
||||
|
||||
|
||||
Proyecto minimal para ejecutar fragment shaders tipo Shadertoy usando SDL3 + GLAD + OpenGL 3.3.
|
||||
|
||||
|
||||
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
|
||||
## Características
|
||||
|
||||
- **Visualizador de shaders fragment** compatible con formato Shadertoy
|
||||
- **Contador de FPS** en barra de título
|
||||
- **Toggle VSync** con tecla F4
|
||||
- **Cambio de shaders en runtime** con flechas ←/→
|
||||
- **Sistema de metadata** en shaders (Name/Author automático en título)
|
||||
- **Sistema de feedback** para shaders que requieren frame anterior (opcional)
|
||||
- **Soporte de audio** con jail_audio (música de fondo)
|
||||
|
||||
|
||||
|
||||
## 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.
|
||||
- src/ — código fuente C++ (incluye main.cpp)
|
||||
- shaders/ — shaders fragment (.frag.glsl) que se cargan en runtime
|
||||
- data/ — recursos (música, texturas, etc.)
|
||||
- third_party/glad/ — glad.c + headers
|
||||
- third_party/ — jail_audio y otras dependencias
|
||||
- CMakeLists.txt — configuración de build
|
||||
- Makefile — builds de release para Windows/macOS/Linux
|
||||
|
||||
|
||||
|
||||
@@ -63,55 +73,74 @@ brew install cmake sdl3
|
||||
|
||||
## Uso
|
||||
|
||||
Por defecto el ejecutable carga shaders/test.frag.glsl.
|
||||
Ejecutar con un shader específico:
|
||||
|
||||
|
||||
./shadertoy shaders/fractal_pyramid.frag.glsl
|
||||
|
||||
Ejecutar en ventana:
|
||||
|
||||
./shadertoy_sdl3 ../shaders/test.frag.glsl
|
||||
|
||||
|
||||
Ejecutar en fullscreen:
|
||||
|
||||
Ejecutar en fullscreen nativo:
|
||||
./shadertoy -F shaders/seascape.frag.glsl
|
||||
# o
|
||||
./shadertoy --fullscreen shaders/seascape.frag.glsl
|
||||
|
||||
./shadertoy_sdl3 -F ../shaders/test.frag.glsl
|
||||
|
||||
|
||||
|
||||
Si ejecutas desde la raíz del repo:
|
||||
|
||||
./build/shadertoy_sdl3 shaders/frag_tile_iter.frag.glsl
|
||||
./build/shadertoy shaders/water.glsl
|
||||
|
||||
|
||||
|
||||
Atajos en ejecución
|
||||
|
||||
- Escape — salir.
|
||||
### Atajos de teclado
|
||||
|
||||
- F11 — alternar fullscreen desktop.
|
||||
- **ESC** — Salir de la aplicación
|
||||
- **F3** — Toggle fullscreen
|
||||
- **F4** — Toggle VSync (ON/OFF)
|
||||
- **← / →** — Cambiar al shader anterior/siguiente en la carpeta shaders/
|
||||
|
||||
|
||||
|
||||
## Formato de shader esperado
|
||||
|
||||
- #version 330 core
|
||||
### Header obligatorio:
|
||||
```glsl
|
||||
// Name: Nombre del shader
|
||||
// Author: Autor
|
||||
#version 330 core
|
||||
precision highp float;
|
||||
|
||||
- Debe declarar:
|
||||
out vec4 FragColor;
|
||||
in vec2 vUV;
|
||||
uniform vec2 iResolution;
|
||||
uniform float iTime;
|
||||
```
|
||||
|
||||
uniform vec2 iResolution;
|
||||
### Función mainImage (estilo Shadertoy):
|
||||
```glsl
|
||||
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
|
||||
// Tu código aquí
|
||||
// fragCoord está en píxeles
|
||||
vec2 uv = fragCoord / iResolution.xy;
|
||||
fragColor = vec4(uv, 0.5, 1.0);
|
||||
}
|
||||
```
|
||||
|
||||
uniform float iTime;
|
||||
### Wrapper main():
|
||||
```glsl
|
||||
void main() {
|
||||
vec2 fragCoordPixels = vUV * iResolution;
|
||||
vec4 outColor;
|
||||
mainImage(outColor, fragCoordPixels);
|
||||
FragColor = outColor;
|
||||
}
|
||||
```
|
||||
|
||||
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.
|
||||
### Metadata opcional:
|
||||
- `// Name: Nombre` - Aparece en barra de título
|
||||
- `// Author: Autor` - Aparece en barra de título
|
||||
- `// iChannel3: self` - Habilita feedback (frame anterior)
|
||||
|
||||
|
||||
|
||||
@@ -133,15 +162,33 @@ Si obtienes "Failed to load fragment shader file", ejecuta desde la carpeta buil
|
||||
|
||||
|
||||
|
||||
## Multi-pass / Buffers (nota)
|
||||
## Compatibilidad con Shadertoy
|
||||
|
||||
Ejemplo actual es single-pass. Para portar Shadertoy con BufferA/B/C necesitas:
|
||||
### Características soportadas:
|
||||
✅ `iTime` - Tiempo en segundos
|
||||
✅ `iResolution` - Resolución de ventana (vec2)
|
||||
✅ `mainImage()` - Función de entrada estándar
|
||||
✅ Self-feedback - Frame anterior con `// iChannel3: self`
|
||||
|
||||
- crear FBOs y textures por buffer
|
||||
### No soportado actualmente:
|
||||
❌ `iMouse` - Interacción con ratón
|
||||
❌ `iChannel0-2` - Texturas externas
|
||||
❌ Multi-pass completo (BufferA/B/C/D)
|
||||
❌ `iFrame`, `iTimeDelta`, `iDate`
|
||||
|
||||
- renderizar buffers en orden y pasar las texturas como iChannelN a pases posteriores
|
||||
### Diferencias importantes:
|
||||
- **`iResolution`**: En Shadertoy es `vec3(width, height, width/height)`, aquí es `vec2(width, height)`
|
||||
- Solución: `vec3 r = vec3(iResolution.xy, iResolution.x/iResolution.y);`
|
||||
- **Inicialización de variables**: OpenGL nativo requiere inicializar variables explícitamente
|
||||
- **División por valores pequeños**: Puede causar overflow - usar `max(divisor, epsilon)`
|
||||
|
||||
- evitar leer y escribir la misma textura (usar ping-pong si hace falta)
|
||||
### Conversión de shaders de Shadertoy:
|
||||
1. Copiar función `mainImage()` tal cual
|
||||
2. Añadir header estándar (ver arriba)
|
||||
3. Añadir wrapper `main()`
|
||||
4. Eliminar referencias a `iChannel0-3` si no se usan
|
||||
5. Adaptar `iResolution` de vec3 a vec2 si es necesario
|
||||
6. Inicializar variables: `vec3 col = vec3(0.0);` en lugar de `vec3 col;`
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user