Когда я добавляю зеркальный свет, все становится черным. Я могу добавить ambient и diffuse, и это нормально, но как только я добавляю specular, он становится черным.
float4 combined = aL + diffuseLight + spec;
Если я отрицаю его, то он все равно становится черным, но если я ограничу свой вектор до 0 затем он становится равным нулю и ничего не делает.
Я не знаю, почему он это делает, потому что он работал раньше, по какой-то причине он просто остановился.
Это весь мой пиксель код шейдера:
cbuffer lights
{
row_major float4x4 worldM;
row_major float4x4 TransformM;
float4 PointLightpos;
float4 PointLightcolor;
float4 AmbientLightColor;
float pointLightIntensity;
float attenuationA;
float attenuationLinear;
float attenuationQ;
float4 cameraPos;
float4 ambient;
float4 diffuse;
float4 specular;
row_major float4x4 skinMatrix[50];
float ambientIntensity;
float specularExp;
};
Texture2D tex : TEXTURE;
SamplerState mySampler : SAMPLER;
struct Input {
float4 outPos : SV_POSITION;
float3 Color : COLOR;
float4 normal : NORMAL;
float2 UV : TEXCOORD;
float4 worldPos : POSITION;
};
struct Output
{
float4 Color : SV_TARGET;
};
Output main(Input input)
{
Output output;
float4 aL = AmbientLightColor * ambientIntensity;
//* ambientspecularExp
//pointLightDiffuse
float4 plight = PointLightcolor * pointLightIntensity;
float4 pointLightDir = normalize(PointLightpos - input.worldPos);
float4 normalW = float4(input.normal.x, input.normal.y, input.normal.z, input.normal.w);
float4 diffuseFactor = max(dot(pointLightDir, normalW), 0);
//Atten = 1/( att0i + att1i * d + att2i * d²)
float d = distance(PointLightpos, input.worldPos);
float attenuation = 1 / (attenuationA + (attenuationLinear * d) + (attenuationQ * pow(d, 2)));
//diffuseFactor *= attenuation;
float4 diffuseLight = plight *diffuseFactor * diffuse;
//Specular * PointLightcolor
float r = reflect(-pointLightDir, normalW);
float v = normalize(cameraPos - input.worldPos);
//float4 spec = float4(max((pow(dot(r, v), specularExp) * specular), 0));
float4 spec = float4((pow(dot(r, v), specularExp) * specular));
//FinalOutput
float4 combined = aL + diffuseLight + spec;
float4 color = (tex.Sample(mySampler, input.UV));
output.Color = color * combined * attenuation;
//output.Color = float4(1, 1, 1, 1);
return output;
}
Я предполагаю, что что-то не так с камерой или worldpos?