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
|
|
|
}
|
|
|
|
|
};
|