我在使用D3D12计算光照时,光源与材质正常,像素着色器返回了灰色(PIX调试得),但RTV仍然被写入黑色,下面是PSO的RS:

有一部分像素是正常的:

HLSL:
// 默认着色器
// 该着色器使用HLSL编写,适用于DirectX 12
// 该着色器包含顶点着色器和像素着色器
struct Light
{
float3 position; // 光源位置
float FalloffStart;
float3 direction; // 光源方向
float FalloffEnd;
float3 color; // 光源颜色
float SpotPower;
int type; // 光源类型
// 0: 点光源
// 1: 平行光源
// 2: 聚光灯
int3 padding; // 填充以对齐结构体
};
cbuffer cPerObject : register(b0)
{
float4x4 world;
//float4 color; // 颜色可以在材质中设置
};
cbuffer cPerPass : register(b1)
{
float4x4 viewPorj;
float4 cameraPos; // 相机位置
int lightCount;
float3 ambient;
// 将来可能会移入逐物体常量缓冲区
Light lights[10]; // 光源数组,最多10个光源
};
cbuffer cbMaterial : register(b2)
{
float3 diffuseColor;
float pad0;
float3 specularColor;
float pad1;
float3 ambientColor;
float pad2;
float3 emissionColor;
float pad3;
float shininess;
float4x4 textureTransform;
};
struct VSInput
{
float3 mPos : POSITION;
float3 mNurmal : NORMAL;
};
struct VSOutput
{
float4 vPos : SV_Position;
float3 vPosWorld : POSITION;
float3 vNormal : NORMAL;
};
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)
{
float3 halfVec = normalize(lightVec + viewDir);
float diffuse = max(0.0f, dot(normal, lightVec));
float specular = max(0.0f, dot(normal, halfVec));
if (diffuse < 0.0f)
specular = 0.0f; // 如果漫反射为负,则镜面反射为0
else
specular = pow(specular, shininess);
float3 color = diffuse * diffuseColor * lightColor
+ specular * specularColor * lightColor
+ emissionColor;
return color;
}
float3 ComputeDirectionLight(float3 normal, float3 pos, Light light)
{
float3 lightDir = normalize(-light.direction);
float3 viewDir = normalize(cameraPos.xyz - pos);
return Phonglight(normal, viewDir, lightDir, 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, 1.0);
}
帮忙看一下!