Specular делает все черным - PullRequest
0 голосов
/ 19 января 2020

Когда я добавляю зеркальный свет, все становится черным. Я могу добавить 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?

...