45 lines
2.0 KiB
Markdown
45 lines
2.0 KiB
Markdown
|
# Synchronizing shader code and C#
|
||
|
|
||
|
Unity can generate HLSL code based on C# structs to synchronize data and constants between shaders and C#. In Unity, the process of generating the HLSL code from C# code is called generating shader includes. When Unity generates shader includes, it parses all the C# files in the project and, for every file that contains a struct with a GenerateHLSL attribute, generates corresponding HLSL code. It places this HLSL code in a file with the same name as the origin, but uses the `.cs.hlsl` file extension.
|
||
|
|
||
|
## Generating shader includes
|
||
|
|
||
|
To generate an HLSL equivalent for a C# struct:
|
||
|
|
||
|
1. Add the GenerateHLSL attribute to the struct. To do this, above the line that declares the struct, add `[GenerateHLSL(PackingRules.Exact, false)]`. For an example on how to do this, see the sample code below. For more information about the GenerateHLSL attribute, see the [API documentation](../api/UnityEngine.Rendering.GenerateHLSL.html).
|
||
|
2. In the Unity Editor, go to **Edit** > **Render Pipeline** > **Generate Shader Includes**.
|
||
|
|
||
|
The following code example is from the High Definition Render Pipeline (HDRP). It shows an extract of the C# representation of a directional light. The original file is `LightDefinition.cs`. When Unity generates the HLSL shader code, it places it in a new file called `LightDefinition.cs.hlsl`.
|
||
|
|
||
|
|
||
|
```
|
||
|
// LightDefinition.cs
|
||
|
|
||
|
[GenerateHLSL(PackingRules.Exact, false)]
|
||
|
struct DirectionalLightData
|
||
|
{
|
||
|
public Vector3 positionRWS;
|
||
|
public uint lightLayers;
|
||
|
public float lightDimmer;
|
||
|
public float volumetricLightDimmer; // Replaces 'lightDimer'
|
||
|
public Vector3 forward;
|
||
|
public Vector4 surfaceTextureScaleOffset;
|
||
|
};
|
||
|
```
|
||
|
|
||
|
```
|
||
|
// LightDefinition.cs.hlsl
|
||
|
|
||
|
// Generated from UnityEngine.Rendering.HighDefinition.DirectionalLightData
|
||
|
// PackingRules = Exact
|
||
|
struct DirectionalLightData
|
||
|
{
|
||
|
float3 positionRWS;
|
||
|
uint lightLayers;
|
||
|
float lightDimmer;
|
||
|
float volumetricLightDimmer;
|
||
|
float3 forward;
|
||
|
float4 surfaceTextureScaleOffset;
|
||
|
};
|
||
|
```
|