направление взгляда не используют ибо получилось бы что при малейшем движением мыши цвет будет меняться (будто источник света прикреплён к мыши).
нужна позиция света - нормализованный вектр.
нужна нормаль вершины - тоже вектр.
если вектора направлены друг к другу, то цвет передаётся 100 процентов.
лучше бы ты делал всё на основе туториалов.
для базового освещения, затенения, нужна позиция источника света.
// sunAmbient - цвет затенения настраиваемый на CPU
// diffuseColor - тексель текстуры
float4 ambientColor = sunAmbient * diffuseColor;
// sunPosition - позиция ист. света
float4 sunLightDir = float4(sunPosition.xyz,0.f);
// diff - значение, которое будет затенять модель
float diff = max(dot( input.normal, sunLightDir ), 0.0f );
diff *= sunPower;
// sunDiffuse - цвет света
float4 diffuse = sunDiffuse;
// уменьшение интенсивности - затенение
diffuse *= diff;
// добавляем цвет текстуры
diffuse *= diffuseColor;
float4 color = saturate(ambientColor + diffuse);
позиция наблюдателя нужна для specular отражения
// если есть отражение света то вычисляем
if(specularLevel > 0.0f){
float4 Specular = float4(0.f,0.f,0.f,1.f);
Specular *= specularLevel * pow(saturate(dot(reflect(normalize(abs(eyePosition)), input.normal), -sunLightDir)), specularExponent);
color += saturate(Specular);
}
// добавляем shadowmap
color.xyz *= shadowColor.xyz;
color.a = 1.f;
return color;
----------------------------------------------------------
код шейдера естественно зависит от нужд того кто его создал, но я показал рабочий вариант.
