Skip to main content

Pure Python ISF shader renderer with PyOpenGL and json5

Project description

Read the Docs GitHub release PyPI version

pyvvisf

Python ISF shader renderer with PyOpenGL. Render images from your shaders, or visualize in a window.

Overview

pyvvisf is a pure Python implementation for parsing and rendering ISF (Interactive Shader Format) shaders. It provides a modern, maintainable alternative to the C++ VVISF-GL library with enhanced error reporting and cross-platform compatibility. The original version of this library tried to build VVISF-GL bindings, but that approach was abandoned.

This library tried to catch all the errors that would trigger the online ISF renderer here: https://editor.isf.video/. It will also try to provide compatibility warnings when appropriate.

The main use of this library is intended to be from https://github.com/jimcortez/ai-shader-tool, which provides ai's the ablility to validate, render, and inspect the results of shaders it generates.

The majority of code in this repository was built with AI.

Features

  • Pure Python: No C++ compilation required
  • Robust JSON parsing: Uses json5 for comment support and trailing commas
  • Modern OpenGL: PyOpenGL with GLFW for cross-platform context management
  • Enhanced error reporting: Detailed Python-native error messages with context
  • Type safety: Pydantic models for metadata validation
  • Auto-coercion: Automatic type conversion for shader inputs
  • Context management: Automatic resource cleanup

Installation

pip install pyvvisf

Development Installation

git clone https://github.com/jimcortez/pyvvisf.git
cd pyvvisf
pip install -e .

Quick Start

Here's a minimal example using a well-formed ISF shader:

from pyvvisf import ISFRenderer

# A simple ISF shader (every pixel is the selected color)
test_shader = """
/*{
    \"DESCRIPTION\": \"Every pixel is the selected color.\",
    \"CREDIT\": \"pyvvisf example\",
    \"ISFVSN\": \"2.0\",
    \"CATEGORIES\": [\"Generator\"],
    \"INPUTS\": [
        {\"NAME\": \"color\", \"TYPE\": \"color\", \"DEFAULT\": [1.0, 0.0, 0.0, 1.0]}
    ]
}*/
void main() {
    gl_FragColor = color;
}
"""

with ISFRenderer(test_shader) as renderer:
    # Render with the default color (red)
    buffer = renderer.render(512, 512)
    image = buffer.to_pil_image()
    image.save("output_red.png")

    # Render with a custom color (green)
    renderer.set_input("color", (0.0, 1.0, 0.0, 1.0))
    buffer = renderer.render(512, 512)
    image = buffer.to_pil_image()
    image.save("output_green.png")

Examples

See the examples/ directory for complete examples:

  • isf_renderer_demo.py: Render ISF shaders to images, set inputs, and save output.
  • isf_window_demo.py: Render ISF shaders in a window (interactive display).
  • time_offset_demo.py: Render shaders at different time offsets (for animation or frame capture).

Shader examples are in examples/shaders/:

  • simple_color_change.fs: Single color input, fills the screen with the selected color.
  • simple_color_animation.fs: Fades between two user-selected colors over time.
  • shapes.fs: Animated shapes (moving circle, rotating rectangle, pulsating ring).
  • simple.fs: Minimal shader, fills the screen with blue.

Development

Building

# Install development dependencies
pip install -e ".[dev]"

# Run tests
pytest

Project Structure

pyvvisf/
├── src/pyvvisf/
│   ├── renderer.py      # Main renderer
│   ├── parser.py        # ISF parser with json5
│   ├── types.py         # Value types
│   └── errors.py        # Error handling
├── examples/
├── tests/
└── docs/

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyvvisf-0.5.0.tar.gz (37.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyvvisf-0.5.0-py3-none-any.whl (22.0 kB view details)

Uploaded Python 3

File details

Details for the file pyvvisf-0.5.0.tar.gz.

File metadata

  • Download URL: pyvvisf-0.5.0.tar.gz
  • Upload date:
  • Size: 37.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyvvisf-0.5.0.tar.gz
Algorithm Hash digest
SHA256 7f52df3e7e4fccbcae9491a48abbbb0443479fdfd113046d968d1c5fce513c30
MD5 efa09ed3c8c6fee8a1ca0da1aaeb844c
BLAKE2b-256 9d11834a8988abaac5395d9c4d7b1e32a32b5ea008ce272d5ddc2ff850f1e7c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyvvisf-0.5.0.tar.gz:

Publisher: build-wheels.yml on jimcortez/pyvvisf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file pyvvisf-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: pyvvisf-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 22.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for pyvvisf-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d8ae8c17f35c84b222e1e9099ab5262c0deb907633a3da8363925aa36835b124
MD5 40e4e22bbe0e6ca614f69be74ff212d7
BLAKE2b-256 bb611f766212540cfc5b55b6ea25745e113748504a5595801bf54a4e296a44e9

See more details on using hashes here.

Provenance

The following attestation bundles were made for pyvvisf-0.5.0-py3-none-any.whl:

Publisher: build-wheels.yml on jimcortez/pyvvisf

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page