Creating Variants

Creating Shaders Variants

To create a new shader variant use Create > Shader > Lit Shader Variant. The shader gets created from a template default shader. Some shader features are exposed in the importer UI and the rest can be defined in code.

Improvements over Unity Surface Shaders

Syntax

The code syntax is very simple. It contains a few blocks that get copied over to the ShaderLab code. To preview the generated ShaderLab code use Copy Generated Shader on the importer

BlockDescription
PROPERTIESProperties get copied over into the Properties of the ShaderLab code. Some default properties are added before and after
DEFINESShader Features and Defines. Included after the Core RP shader library and before all the code
CBUFFERDeclare all Material properties excluding textures. Copied after importing the Core RP Library and code used for lighting
CODEContains texture declarations and override functions for parts of the vertex and fragment shader. All existing override functions are included in the template

Configuring VS Code

To have proper HLSL syntax highlighting you can set a language mode to be associated with this file extension. Bottom right click on "Plain Text" and "Set file association for .litshader" and select HLSL.

Importer Shader Defines

The importer sets some additional useful defines.

To update defines reimport all shaders Tools > Lit > Reimport Shaders

DefineDescription
VRCHAT_SDKDefined if the VRChat SDK is imported in the project.
LTCGI_EXISTSDefined if LTCGI is imported in the project. Used internally for disabling LTCGI.
BUILD_TARGET_PCDefined if the current platform is PC/Windows
BUILD_TARGET_ANDROIDDefined if the current platform is Android/Quest
BAKERY_INCLUDEDSame as the C# define, defined if bakery is imported in the project

Including Other Shaders

It is possible to stack other shaders by including a .litshader outside of code blocks. To stack an output of a previous function you can redefine it and access the previous function inside it. Example

Optional Includes

Using #include_optional "" instead of #include "" will only include the file if it exists, so it doesn't cause errors. This also works on .litshader file types. With this it is possible to make a global include with code that will be included in all shaders, it works as stacked shader. The default template will include file at path Assets/Settings/LitShaderConfig.litshader.

If a file at the included path doesn't exist, the importer will still register it as a dependency and automatically re-import it when its created.

Custom Interpolators

You can set fully custom varyings to access in the vertex and fragment shaders. Example

#define CUSTOM_VARYING0 float2 uvData : VARYING0;
...
 
void ModifyVaryings(Attributes attributes, VertexDescription description, inout Varyings varyings)
{
    varyings.uvData.xy = TRANSFORM_TEX(attributes.uv0.xy, _MainTex);
}
 
...
 
void SurfaceDescriptionFunction(Varyings IN, inout SurfaceDescription surface)
{
    float4 mainTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
}

Defines

Varyings and Attributes struct defines can be found here https://github.com/z3y/shaders/blob/0fcf47b332f4de34b3e9873ee7f37595e1ad99c1/ShaderLibrary/ShaderPass.hlsl#L367-L538 (opens in a new tab)