Um renderizador modular em Python baseado em OpenGL, com suporte nativo para shaders do ShaderToy. Execute códigos do ShaderToy diretamente, além de criar gráficos 3D, usar shaders customizados, texturas e visualizações de áudio reativas.
- Renderização OpenGL com pipeline moderno (shaders programáveis)
- Renderizador de Fragment Shaders - Ferramenta dedicada para renderizar arquivos .frag
- Compatibilidade com ShaderToy - Execute shaders do ShaderToy sem modificações
- Sistema de Câmera com modos de visualização "examine" e "fly"
- Visualização e processamento de áudio em tempo real com FFT para shaders reativos
- Iluminação com modelos Phong/Blinn-Phong
- Sistema de texturização para mapeamento UV
- Interface com ImGui para controles em tempo real
- Python 3.11 ou superior (3.13 apresenta atualmente problemas como imgui)
- OpenGL 3.3 ou superior
- Dependências Python (ver
requirements.txt)
Clone o repositório e instale em modo de desenvolvimento para poder editar o código fonte:
git clone https://github.com/lpsoares/RenderizadorOpenGL.git
cd RenderizadorOpenGL
pip install -e .Execute os exemplos incluídos para ver as diferentes funcionalidades:
python exemplos/exemplo0.py # Renderização básica
python exemplos/exemplo1.py # Câmera e iluminação
python exemplos/exemplo5.py # TexturasO projeto inclui uma ferramenta dedicada para renderizar fragment shaders no estilo ShaderToy:
# Renderizar um shader específico
python render_frag.py exemplos/frag/mandelbulb.frag
# Especificar uma resolução personalizada
python render_frag.py exemplos/frag/ray_marching.frag --resolution 800 600O RenderizadorOpenGL é organizado em módulos para facilitar a extensão e manutenção:
src/renderizador/
│
├── core/ # Componentes principais
│ ├── renderer.py # Renderizador principal
│ ├── window.py # Gerenciamento de janelas GLFW
│ └── gui.py # Interface ImGui
│
├── graphics/ # Recursos gráficos
│ ├── camera.py # Sistema de câmera
│ ├── geometry.py # Manipulação de geometria
│ ├── mesh.py # Faz a gestão de malhas poligonais
│ ├── primitives.py # Gera primitivas como um quad para a tela cheia
│ ├── shaders.py # Compilação e gerenciamento de shaders
│ └── texture.py # Carregamento e manipulação de texturas
│
├── audio/ # Processamento de áudio
│ ├── audio.py # Reprodução e controle de áudio
│ └── fft_processor.py # Processamento FFT para visualização
│
└── utils/ # Utilidades
├── callbacks.py # Callbacks de eventos
├── fragshader_rndr.py # Renderizador de fragment shaders
├── transformations.py # Transformações 3D
└── uniforms.py # Gerenciamento de uniforms de shaders
from renderizador import Renderizador
from renderizador.graphics.camera import Camera
from OpenGL.GL import *
# Inicialize o renderizador
renderizador = Renderizador(resolution=(1024, 768))
# Configure uma câmera
camera = Camera(type="examine", near=0.1, far=100, eye=[0.0, 0.0, 10.0])
renderizador.set_camera(camera)
# Configure shaders e uniforms
renderizador.set_shaders(
vertex_shader_source=meu_vertex_shader,
fragment_shader_source=meu_fragment_shader,
uniforms_source={
"projection": camera.get_projection_matrix,
"view": camera.get_view_matrix,
"model": identity_matrix,
}
)
# Configure geometria
renderizador.add_geometry(GL_TRIANGLES, vertices, normals=normals, uvs=uvs)
# Renderize a cena
renderizador.render()O módulo fragshader_rndr.py fornece uma API simples para carregar e renderizar fragment shaders:
from renderizador.utils.fragshader_rndr import load_fragment_shader, main
# Carregar um shader de um arquivo
shader_code = load_fragment_shader("caminho/para/meu_shader.frag")
# Executar o renderizador com argumentos da linha de comando
main()Para mais detalhes sobre a API e exemplos, consulte a documentação completa em docs/:
- Guia de Início Rápido
- Compatibilidade com ShaderToy - Guia completo de como usar shaders do ShaderToy
- Renderizador de Fragment Shaders
O projeto inclui um exemplo demonstrativo de compatibilidade total com ShaderToy:
# Execute um exemplo de shader ShaderToy complexo
python exemplos/exemplo_shadertoy.pyContribuições são bem-vindas! Veja CONTRIBUTING.md para mais detalhes.
Este projeto é licenciado sob a Licença MIT - veja o arquivo LICENSE para detalhes.
Desenvolvido por Luciano Soares - lpsoares@insper.edu.br