HLSL如何处理任意数量的小数字?

时间:2018-04-14 06:09:45

标签: c++ directx directx-11 hlsl

首先,我使用世界转换渲染单位正方形,将其转换为屏幕中间。到目前为止一切正常。这是结果图片。

enter image description here

然而,当我应用视图转换时,我开始遇到一些问题。这是我创建视图矩阵的代码。

XMFLOAT4X4 viewMatrix;
XMVECTOR eye = XMLoadFloat3(&m_Eye);
XMVECTOR focus = XMLoadFloat3(&m_LookAt);
XMVECTOR up = XMLoadFloat3(&m_Up);
XMStoreFloat4x4(&viewMatrix, XMMatrixLookAtLH(eye, eye + focus, up));

因此,我将问题跟踪到以下代码中 lookAt 向量的创建。

float x = cos(XMConvertToRadians(m_Yaw)) * cos(XMConvertToRadians(m_Pitch));
float y = sin(XMConvertToRadians(m_Pitch));
float z = sin(XMConvertToRadians(m_Yaw)) * cos(XMConvertToRadians(m_Pitch));
XMVECTOR m_LookAt = -XMVector3Normalize(XMVectorSet(x, y, z, 0.0f));

应用以下参数......

  • m_Yaw = -90.0f
  • m_Pitch = 0.0f
  • m_Eye = (0.0f, 0.0f, -5.0f)

...在

中生成(-4.37113883e-008, 0.0, -1.0) lookAt 向量
{             1.0, 0.0, 4.37113883e-008, 0.0}
{             0.0, 1.0,             0.0, 0.0}
{-4.37113883e-008, 0.0,             1.0, 0.0}
{-2.18556949e-007, 0.0,             5.0, 1.0}

查看矩阵和下图。

enter image description here

因此,我尝试使用相同的 m_Yaw m_Pitch 参数创建硬编码的 lookAt 向量。

x = cos(-90) * cos(0) = 0 * 1 = 0
y = sin(0) = 0
z = sin(-90) * cos(0) = -1 * 1 = -1

唯一的区别是 x 值导致0而不是-4.37113883e-008,我认为这是由于转换为弧度。仅此而且#34;修复"问题和结果图像与第一个图像相同。

但是,因为我无法修复这些值。我创建了一个小常量const float kEpsilon = 0.0001f;,并将 lookAt 向量中任何小于kEpsilon且大于-kEpsilon的组件限制为零。

XMVECTOR lookAt = XMVectorSet(
    x < kEpsilon && x > -kEpsilon ? 0.0f : x,
    y < kEpsilon && y > -kEpsilon ? 0.0f : y,
    z < kEpsilon && z > -kEpsilon ? 0.0f : z,
    0.0f
);

但这感觉就像一个廉价的解决方案,我仍然不明白为什么这个错误发生了。这是由于DirectX的任何特殊性,我可能不知道?或者错误出现在我的代码中?

其他信息:

0 个答案:

没有答案