Я использую обычное направленное освещение, по Фонгу, учитывая ambient и diffuse. Нормали высчитываются с помощью алгоритма усреднения: генерируем нормали для каждого треугольника, далее для вершин, которые входят в несколько треугольников, складываем все полученные нормали каждого треугольника, в который входит эта вершина, и усредняем. Пиксельный шейдер прост:
cbuffer ConstantBufferPS
{
float4 Direction; // направление света
float4 Color; // цвет света
float4 ambient_factor; // коэффициент фонового освещения
}
struct VS_INPUT
{
float4 Pos: SV_POSITION;
float3 Normal: TEXCOORD0;
float4 Color: COLOR0;
};
float4 main(VS_INPUT input): SV_Target
{
// ambient освещение
float4 ambient = (Color * ambient_factor.x) * input.Color;
// diffuse освещение
float4 diffuse = saturate(dot(input.Normal, Direction) * Color);
// устанавливаем прозрачность + итоговый свет
float4 out_color = (ambient + diffuse) * input.Color;
out_color.a = 1;
return out_color;
}
Объект не использует текстуру. Однако, при освещении, свет получается не очень мягким:
Как просчитать более мягкий свет? P.S.: я слышал про bump mapping, он придаст рельеф и освещение будет более мягким. Но хотелось бы услышать советы и по моей ситуации, быть может использовать другой алгоритм расчёта нормалей, etc
Сборка персонального компьютера от Artline: умный выбор для современных пользователей