镜面光照在原点 (0, 0, 0) 处中断
Specular Lighting breaks at origin (0, 0, 0)
我在使用镜面照明时遇到问题。我的应用程序中似乎有某种我无法跟踪的错误。
光线是从前面射进来的(截图显示相机看-z方向,左边是-x)。
一个简单的高光输出显示以下失败:
使用的代码:
float3 n = normalize(input.normal); // world space normal, mul(float4(normal, 0.0), modelMatrix)
float3 l = normalize(-sDirection); // constant direction (like 0.7, -0.8, -0.7)
float3 v = normalize(viewPos.xyz - input.vertexWorldSpace.xyz); // viewpos = world space camera position
float3 LightReflect = normalize(reflect(n,l));
float SpecularFactor = dot(v, LightReflect);
color = float4(SpecularFactor, SpecularFactor, SpecularFactor, 1.0);
为了检查可能的变量错误,我检查了 input.VertexWorldSpace:
为了同时检查光照方向和法线,我检查了漫反射项:
和相机到顶点视图向量(v):
对我来说,所有部分看起来都很好,但镜面反射在原点 (0,0,0) 和垂直于光方向的地方仍然变黑。
我还制作了一张 gif,显示原点 (0, 0, 0) 处的视图方向矢量发生了什么
另一个显示相机位置和镜面变黑的 gif:
http://i.imgur.com/ajUaekA.gifv
我对 v 使用了错误的计算吗?
好的,问题出在我的缓冲区对齐上:https://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx
而不是通过
Matrix
Matrix
Vec3
Vec3
hlsl 需要 16 字节对齐向量
所以我不得不使用
Matrix
Vec3
float1 // 16 byte alignment
Vec3
float1 // 16 byte alignment
我在使用镜面照明时遇到问题。我的应用程序中似乎有某种我无法跟踪的错误。
光线是从前面射进来的(截图显示相机看-z方向,左边是-x)。
一个简单的高光输出显示以下失败:
使用的代码:
float3 n = normalize(input.normal); // world space normal, mul(float4(normal, 0.0), modelMatrix)
float3 l = normalize(-sDirection); // constant direction (like 0.7, -0.8, -0.7)
float3 v = normalize(viewPos.xyz - input.vertexWorldSpace.xyz); // viewpos = world space camera position
float3 LightReflect = normalize(reflect(n,l));
float SpecularFactor = dot(v, LightReflect);
color = float4(SpecularFactor, SpecularFactor, SpecularFactor, 1.0);
为了检查可能的变量错误,我检查了 input.VertexWorldSpace:
为了同时检查光照方向和法线,我检查了漫反射项:
和相机到顶点视图向量(v):
对我来说,所有部分看起来都很好,但镜面反射在原点 (0,0,0) 和垂直于光方向的地方仍然变黑。
我还制作了一张 gif,显示原点 (0, 0, 0) 处的视图方向矢量发生了什么
另一个显示相机位置和镜面变黑的 gif: http://i.imgur.com/ajUaekA.gifv
我对 v 使用了错误的计算吗?
好的,问题出在我的缓冲区对齐上:https://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx
而不是通过
Matrix
Matrix
Vec3
Vec3
hlsl 需要 16 字节对齐向量 所以我不得不使用
Matrix
Vec3
float1 // 16 byte alignment
Vec3
float1 // 16 byte alignment