Skip to main content

vcti-shader-base

The vocabulary a shader feature declares itself with: attribute/uniform/output specs and the ShaderDefinition record. Zero dependencies.

Overview

Shaders in this system are compiled ahead of time.

A build step turns Slang sources into GLSL ES text. Whatever draws with the result later — a web viewer, a test harness — did not compile it and cannot inspect it. So it has to be told what the shader expects:

  • which buffer belongs in each vertex attribute,
  • which uniforms exist and how large they are,
  • which integer selects which mode.

Writing that down is what this package is for.

A shader feature is one piece of composable shading math. Here are some examples:

  • deform moves geometry,
  • fringe colors it by bands,
  • derive computes a quantity from a source field — scalar, vector, 6-DOF or tensor,
  • atom-lut culls hidden atoms.

Each ships as its own installable package. Each declares what its own math needs, and says what it is.

vcti-shader-base is the vocabulary for writing exactly that declaration, and nothing more:

  • Field specsAttributeSpec (per-vertex inputs), UniformSpec (draw-constant values), OutputSpec (fragment outputs).
  • The definitionShaderDefinition, with StageRole: how a feature names the stage it runs in, the Slang modules it ships, and the capability tags it introduces.

Declaring a feature needs nothing else — no compiler, no build toolchain, no other package.

Installation

pip install vcti-shader-base

Requires Python 3.12, 3.13, or 3.14. No runtime dependencies.

In requirements.txt

vcti-shader-base>=1.0.0

In pyproject.toml dependencies

dependencies = [
    "vcti-shader-base>=1.0.0",
]

Quick Start

Declare what the shading math needs

Consider a structural analysis. A CAE solver reports how far each node of a mesh moves under a load, and we want to draw the deformed shape.

Every vertex carries two values — where it sits, and how far it moved. Both vary per vertex, so both are attributes. We also want to exaggerate the movement, scaling it independently in x, y and z; that factor is the same for every vertex in the draw, so it is a uniform:

from vcti.shader.base import AttributeSpec, UniformSpec

inputs = (
    AttributeSpec("a_position", "vec3", "coordinates"),
    AttributeSpec("a_deformation", "vec3", "deformation"),
)
uniforms = (UniformSpec("u_deformScale", "vec3"),)

a_position and a_deformation are the names the shader source uses. The third argument is the semantic, and it is what makes the declaration useful to a caller. A caller has buffers of its own — node coordinates, a displacement field — and must know which one goes where. The name cannot answer that: it is a shader-source detail and can be renamed. The semantic names the data instead, so coordinates means mesh node positions and deformation means the displacement vector.

Two optional fields are worth knowing. array_length stays a number so Python can size a buffer, and gl_type joins it onto the type only where the type is emitted:

UniformSpec("u_bandColors", "vec4", array_length=8).gl_type   # 'vec4[8]'
UniformSpec("u_deformScale", "vec3").gl_type                  # 'vec3'

named_values turns an integer a caller would otherwise hard-code into something nameable:

mode = UniformSpec("u_deformMode", "int", named_values={"displacement": 0, "rotation": 1})
mode.named_values["rotation"]      # 1 — the value to write

A feature in the fragment stage also declares what it writes:

from vcti.shader.base import OutputSpec

outputs = (OutputSpec("fragColor", "vec4"),)

Describe the feature itself

The specs say what the shading math needs. A ShaderDefinition says what the feature is. Each feature constructs exactly one and exports it as DEFINITION:

from pathlib import Path
from vcti.shader.base import ShaderDefinition, StageRole

DEFINITION = ShaderDefinition(
    id="deform",
    role=StageRole.VERTEX,
    capabilities=("deform3", "deform6"),
    slang_modules=("deform.slang",),
    slang_dir=Path(__file__).parent / "slang",
    description="deform3 scaled displacement; deform6 Rodrigues rotation.",
)
  • role is where the feature's math runs. VERTEX moves geometry; FRAGMENT decides color.
  • capabilities are the tags this feature offers. They are opaque strings and each feature owns its own, so adding one needs no release of this package.
  • slang_modules names the Slang modules this feature publishes for a shader to import. slang_dir says where they live — and it is the field with teeth: the .slang files are installed inside the feature's own package, so only the feature can resolve the directory, and the build passes it to the compiler as an import search path. This package only records the path; it never opens it, so confirming the files are really there is the feature's own test's job.

A feature that stops here is complete: it constructs one ShaderDefinition, exports it as DEFINITION, and declares the specs its math needs.

Type Reference

Type Fields Notes
AttributeSpec name, type, semantic A per-vertex input, and what its data is
UniformSpec name, type, array_length=None, named_values=None gl_type joins the array suffix; named_values only on dispatch uniforms
OutputSpec name, type A fragment output; no semantic, since there is nothing to bind
ShaderDefinition id, role, capabilities, slang_modules, slang_dir, description="" One feature's self-declaration
StageRole VERTEX, FRAGMENT Where the feature's math runs

Every type is immutable and compared by value, and every one is hashable — so specs can go in a set or a dict key, and duplicates drop out on their own.

Dependencies

None — the standard library covers it. A feature can declare its specs and its definition without installing a compiler or a build toolchain behind it.

Development extras: test (pytest, pytest-cov), lint (ruff), typecheck (mypy).

Documentation

If you want to… Read
Get started using the package Quick Start above
Build and ship a complete feature, and avoid the pitfalls docs/patterns.md
Understand what these types describe and why docs/design.md
Navigate or modify the source docs/source-guide.md

Download files

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

Source Distribution

vcti_shader_base-1.0.1.tar.gz (20.0 kB view details)

Uploaded Source

Built Distribution

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

vcti_shader_base-1.0.1-py3-none-any.whl (9.1 kB view details)

Uploaded Python 3

File details

Details for the file vcti_shader_base-1.0.1.tar.gz.

File metadata

  • Download URL: vcti_shader_base-1.0.1.tar.gz
  • Upload date:
  • Size: 20.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for vcti_shader_base-1.0.1.tar.gz
Algorithm Hash digest
SHA256 9cf2bb646dc6b57c460fb3d573ea467df7b41fdb5b4851a87b9abcf17c58a87f
MD5 c81de4b3243fd0019e31105cde847bc1
BLAKE2b-256 af697c7bbeee7f47e26b97dee115e71e3c67b99342419c3649a11eca56e46031

See more details on using hashes here.

Provenance

The following attestation bundles were made for vcti_shader_base-1.0.1.tar.gz:

Publisher: release.yml on vcollab/vcti-python-shader-base

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

File details

Details for the file vcti_shader_base-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for vcti_shader_base-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ba343027c1888285da040923c48b4f215d454afa0cdee937e1cdef362e9a8ba1
MD5 618671ddce46de1bdfed9aa234836a63
BLAKE2b-256 33c8972350fc6f9ca31b4633f50cde7e54c5889df695dca4f2be4786a53d42dd

See more details on using hashes here.

Provenance

The following attestation bundles were made for vcti_shader_base-1.0.1-py3-none-any.whl:

Publisher: release.yml on vcollab/vcti-python-shader-base

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

Release history Release notifications | RSS feed

1.0.2

2 files

This release

1.0.1 This release

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page