I'am trying to understand specular reflection in HLSL and DirectX11
cbuffer ConstantBuffer : register( b0 )
{
matrix World; // Матрица мира
matrix View; // Матрица вида
matrix Projection; // Матрица проекции
float4 vLightDir[3]; // Dir of light
float4 vLightColor[3]; // color of light
float4 vOutputColor; // Active color
//float3 Eye;
}
struct VS_INPUT // Входящие данные вершинного шейдера
{
float4 Pos : POSITION; // Позиция по X, Y, Z
float3 Norm : NORMAL; // Нормаль по X, Y, Z
};
struct PS_INPUT // Входящие данные пиксельного шейдера
{
float4 Pos : SV_POSITION; // Позиция пикселя в проекции (экранная)
float3 Norm : TEXCOORD0; // Относительная нормаль пикселя по tu, tv
};
PS_INPUT VS( VS_INPUT input )
{
PS_INPUT output = (PS_INPUT)0;
output.Pos = mul( input.Pos, World );
output.Pos = mul( output.Pos, View );
output.Pos = mul( output.Pos, Projection );
output.Norm = mul( input.Norm, World );
return output;
}
float4 Diffuse( PS_INPUT input) : SV_Target
{
float4 diffuse = float4(1.0, 1.0, 1.0, 1.0);
float4 finalColor = diffuse *0.1;
// Adding all light colours
for(int i=0; i<3; i++)
{
finalColor += saturate( dot( (float3)vLightDir[i], input.Norm) * vLightColor[i] );
}
finalColor.a = 1;
return finalColor;
}
float4 Specular(PS_INPUT input) : SV_Target
{
float4 diffuse = float4(1.0, 0.0, 0.0, 1.0);
float4 finalColor = diffuse *0.1;
float3 Eye = float3(0.0f, 4.0f, -20.0f);
float4 intensity = 0.1;
float power = 4;
float3 R = reflect(-normalize(Eye), input.Norm);
for (int i = 0; i < 3; i++)
{
finalColor += saturate(intensity * vLightColor[i] * pow(dot(R, Eye), power));
}
return finalColor;
}
float4 PSSolid( PS_INPUT input) : SV_Target
{
return vOutputColor;
}
Now I have only diffuse reflection, specular is show only white cube. :( Where can I get an example or tutor about specular reflection?
H
needs to be normalized. – Forequarter