1

我有问题让镜面照明工作。看起来我的应用程序中有某种我无法追踪的错误。

光线来自前面(屏幕截图显示相机朝向 -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,显示在 origin(0, 0, 0) 处的视图方向向量会发生什么

http://imgur.com/2YlqcGP

另一个 gif 显示相机位置和高光变黑的位置:http: //i.imgur.com/ajUaekA.gifv

我是否对 v 使用了错误的计算?

4

1 回答 1

0

好的,问题出在我的缓冲区对齐上: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
于 2015-09-16T11:51:29.337 回答