Files
Seele/res/shaders/lib/BRDF.slang
T

62 lines
1.3 KiB
Plaintext
Raw Normal View History

2020-06-02 11:46:18 +02:00
import Common;
interface IBRDF
{
2023-11-30 11:51:53 +01:00
float3 evaluate(float3x3 tbn, float3 viewDir_WS, float3 lightDir_WS, float3 lightColor);
2020-06-02 11:46:18 +02:00
};
struct BlinnPhong : IBRDF
{
float3 baseColor;
2023-07-13 21:01:20 +02:00
float metallic;
float3 normal;
float roughness;
float sheen;
__init()
{
metallic = 0;
normal = float3(0, 0, 1);
roughness = 0.5;
sheen = 1;
}
2020-06-02 11:46:18 +02:00
2023-12-03 23:12:20 +01:00
float3 evaluate(float3x3 tbn, float3 viewDir_TS, float3 lightDir_TS, float3 lightColor)
2020-06-02 11:46:18 +02:00
{
2023-12-03 23:12:20 +01:00
float3 normal_TS = normalize(normal);
float diffuse = max(dot(normal_TS, lightDir_TS), 0);
float3 h = normalize(lightDir_TS + viewDir_TS);
float specular = saturate(dot(normal_TS, h));
2020-06-02 11:46:18 +02:00
2023-12-03 23:12:20 +01:00
return baseColor * (diffuse + specular) * lightColor;
2020-06-02 11:46:18 +02:00
}
};
2024-01-02 16:48:03 +01:00
struct CelShading : IBRDF
2020-06-02 11:46:18 +02:00
{
float3 baseColor;
2024-01-02 16:48:03 +01:00
float3 normal;
__init()
{
normal = float3(0, 0, 1);
}
2020-06-02 11:46:18 +02:00
2023-11-30 11:51:53 +01:00
float3 evaluate(float3x3 tbn, float3 viewDir_TS, float3 lightDir_TS, float3 lightColor)
2020-06-02 11:46:18 +02:00
{
2024-01-02 16:48:03 +01:00
float3 normal_TS = normalize(normal);
float nDotL = dot(normal_TS, lightDir_TS);
float diffuse = max(nDotL, 0);
float3 darkenedBase = baseColor * 0.8;
if(diffuse > 0.5)
{
return baseColor * lightColor;
}
else
{
return darkenedBase * lightColor;
}
2020-06-02 11:46:18 +02:00
}
};