Surface Shader - Shader API

surface-shader.glsl

To create a shader resource that can be used in Substance Painter, just create a glsl file containing a single function called shade with the following profile:


void shade(V2F inputs);

V2F input type definition:


struct V2F {

  vec3 normal;               // interpolated normal

  vec3 tangent;              // interpolated tangent

  vec3 bitangent;            // interpolated bitangent

  vec3 position;             // interpolated position

  vec4 color[1];             // interpolated vertex colors (color0)

  vec2 tex_coord;            // interpolated texture coordinates (uv0)

  SparseCoord sparse_coord;  // interpolated sparse texture coordinates used by textureSparse() sampling function

  vec2 multi_tex_coord[8];   // interpolated texture coordinates (uv0-uv7)

};

Note: To obtain a SparseCoord for uv1-uv7, you have to explicitly call getSparseCoord(vec2) defined in lib-sparse.glsl

Surface shader outputs:

The following functions can be called from within the shade function to describe fragment properties:


// fragment opacity. default value: 1.0

void alphaOutput(float);

// diffuse lighting contribution. default value: vec3(0.0)

void diffuseShadingOutput(vec3);

// specular lighting contribution. default value: vec3(0.0)

void specularShadingOutput(vec3);

// color emitted by the fragment. default value: vec3(0.0)

void emissiveColorOutput(vec3);

// fragment color. default value: vec3(1.0)

void albedoOutput(vec3);

// subsurface scattering properties, see lib-sss.glsl for details. default value: vec4(0.0)

void sssCoefficientsOutput(vec4);

As an example, the most basic rendering equation for computing the fragment color is: emissiveColor + albedo * diffuseShading + specularShading

recommendation-more-help
4517c71e-0531-47f5-b14d-d3b9de4d0104