在使用D3D12计算光照时(现在只写了方向光),渲染了一个球体,有明显问题,着色器核心代码如下:
VSOutput VS(VSInput vIn)
{
VSOutput output;
// float4x4 m = mul(world, viewPorj);
output.vPos = mul(mul(float4(vIn.mPos, 1.0), world), viewPorj);
output.vPosWorld = mul(float4(vIn.mPos, 1.0), world).xyz;
output.vNormal = mul(vIn.mNurmal, (float3x3) world);
output.vNormal = normalize(output.vNormal);
return output;
}
// 光照辅助函数
float3 CalcAttenuation(float d, float falloffStart, float falloffEnd)
{
if (d < falloffStart)
return 1.0f;
if (d > falloffEnd)
return 0.0f;
return saturate((falloffEnd - d) / (falloffEnd - falloffStart));
}
float3 SchlickFrensnel(float cosTheta, float3 R0)
{
float m = 1.0 - cosTheta;
return R0 + (1.0f - R0) * (m * m * m * m * m);
}
float3 Phonglight(float3 normal, float3 viewDir, float3 lightVec, float3 lightColor)
{
float m = roughness * 256.0f;
float3 halfVector = normalize(viewDir + lightVec);
float roughnessFactor = max(0.0f, dot(normal, halfVector));
roughnessFactor = (m + 8.0f) / 8.0f * pow(roughnessFactor, m);
float3 Frensnel = SchlickFrensnel(dot(viewDir, halfVector), FrensnelR0);
float3 spec = roughnessFactor * Frensnel;
spec = saturate(spec);
return (spec + (float3) diffuseColor) * lightColor;
}
float3 ComputeDirectionLight(float3 normal, float3 pos, Light light)
{
float3 lightVec = -light.direction;
lightVec = normalize(lightVec);
float ndotl = dot(normal, lightVec);
ndotl = max(ndotl, 0.0f);
return ndotl * Phonglight(normal, ((float3) cameraPos - pos), lightVec, light.color);
}
float4 PS(VSOutput pIn) : SV_TARGET
{
float3 normal = normalize(pIn.vNormal);
float3 color = ambient * (float3) diffuseColor;
for (int i = 0; i < lightCount;i++)
{
if (lights[i].type == 1) // 平行光源
color += ComputeDirectionLight(normal, pIn.vPosWorld, lights[i]);
}
color = saturate(color);
return float4(color, diffuseColor.a);
}
PIX抓帧得:

然后得到一个这样的窗口:

明显,底部和中间不对,而左边是对的
帮忙看一下!