我目前在 Directx 11 中遇到照明问题,实际上是环境照明问题。这是代码:
cbuffer ConstantBuffer
{
float4x4 final;
float4x4 rotation; // the rotation matrix
float4 lightvec; // the light's vector
float4 lightcol; // the light's color
float4 ambientcol; // the ambient light's color
}
struct VOut
{
float4 color : COLOR;
float4 position : SV_POSITION;
};
VOut VShader(float4 position : POSITION, float4 normal : NORMAL)
{
VOut output;
output.position = mul(final, position);
// set the ambient light
output.color = ambientcol;
// calculate the diffuse light and add it to the ambient light
float4 norm = normalize(mul(rotation, normal));
float diffusebrightness = saturate(dot(norm, lightvec));
output.color += lightcol * diffusebrightness;
return output;
}
float4 PShader(float4 color : COLOR) : SV_TARGET
{
return color;
}
然后我将值发送到着色器:
ambLight.LightVector = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 0.0f);
ambLight.LightColor = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f);
ambLight.AmbientColor = D3DXCOLOR(0.2f, 0.2f, 0.2f, 1.0f);
ShaderManager.UpdateSubresourceDiffuseShader(devcon);
为什么?
我尝试了你的着色器,似乎可以工作,所以也许某些变量没有正确传递。
你可以尝试直接设置一个变量名来输出颜色:
output.color = lightvec;
和
output.color = lightcol;
作为开始,您可以仔细检查值是否正确传递。
看起来你的常量缓冲区没有正确发送。
顺便说一句,我在这里完成了一些很酷的环境照明-> https://www.youtube.com/watch?v=GVy6g4I0zzk