Skip to content

Shader API

ShaderManager

Game-facing service available as $engine->shaders or via the Shader facade.

Methods

MethodReturnsDescription
register(id, definition)voidRegister or override a shader
has(id)boolCheck if a shader is registered
get(id)?ShaderDefinitionGet a shader definition
available()string[]List all registered shader IDs
use(shaderId)voidActivate global shader override
reset()voidReset to material-driven selection
active()?stringCurrent override ID, or null
isOverridden()boolWhether a global override is active

ShaderDefinition

Readonly value object describing a shader program:

php
use PHPolygon\Rendering\ShaderDefinition;

$def = new ShaderDefinition(
    vertexPath: 'resources/shaders/source/toon.vert.glsl',
    fragmentPath: 'resources/shaders/source/toon.frag.glsl',
);

ShaderRegistry

Static registry mapping shader IDs to definitions. Used internally by the renderer; prefer ShaderManager / Shader facade for game code.

php
use PHPolygon\Rendering\ShaderRegistry;

ShaderRegistry::register('id', $definition);
ShaderRegistry::get('id');      // ?ShaderDefinition
ShaderRegistry::has('id');      // bool
ShaderRegistry::ids();          // string[]
ShaderRegistry::clear();

Backend Shader Pipeline

All shaders are authored in GLSL. Each 3D backend handles compilation differently:

BackendPipeline
OpenGLRenderer3DGLSL compiled at runtime via glCreateShader
MetalRenderer3DGLSL cross-compiled to Metal Shading Language via MoltenVK/SPIRV-Cross
VulkanRenderer3DGLSL compiled to SPIR-V at build time via glslangValidator

The shader system is backend-agnostic - ShaderRegistry stores GLSL source paths regardless of which renderer executes them.

Built-in Shaders

Registered automatically when the 3D renderer is constructed:

IDVertexFragmentPurpose
defaultmesh3d.vert.glslmesh3d.frag.glslFull PBR with 10 procedural modes
unlitunlit.vert.glslunlit.frag.glslAlbedo + fog, no lighting
normalsnormals.vert.glslnormals.frag.glslNormal visualization
depthdepth.vert.glsldepth.frag.glslDepth buffer visualization
shadowshadow.vert.glslshadow.frag.glslDepth-only pass for shadow maps (internal)
skyboxskybox.vert.glslskybox.frag.glslCubemap skybox

Material Shader Property

php
use PHPolygon\Rendering\Material;

$mat = new Material(
    albedo: new Color(1.0, 0.0, 0.0),
    shader: 'unlit',  // defaults to 'default'
);

Shader Resolution Priority

  1. SetShader command override (via Shader::use())
  2. Material::$shader property
  3. 'default' fallback

Released under the MIT License.