Return 反余弦值?

Return values for arccosine?

我实现了一个 day/night 着色器,它建立在只有面向定向光源的物体一侧的像素被照亮的基础上。我根据方向光的位置和 3D 中像素的位置之间的单位向量计算这个 space:

float3 direction = normalize(Light.Position - Object.Position);
float theta = abs(acos(dot(normalize(Object.Position), direction))) * 180 / 3.14f;
if (theta < 180)
    color = float3(1.0f);
else
    color = float3(0.2f);

return float4(color, 1.0f);

这很好用,但由于我最近在复习数学,这让我想到我应该确保我理解 acos 是什么 return。


从数学上讲,我知道反余弦应该给出 -11 之间的弧度角,而余弦应该给出 -11 以弧度表示的角度。

documentation 指出对于 acos,输入值应该在 -11 之间,这遵循了这个想法,但它没有告诉我是否return 值为 0 - π-π - π0 - 2π 或类似范围。

Return Value

The arccosine of the x parameter.

Type Description

Name [Template Type] 'Component Type' Size
x [scalar, vector, or matrix] 'float' any
ret [same as input x] 'float' same dimension(s) as input x

HLSL 并没有给我一个很容易测试的方法,所以我想知道是否有人有这方面的文档。


HLSL 函数 acos 的 return 范围是多少?

我对这个主题进行了一些测试,发现 acos return 的 HLSL 版本的值介于 0π 之间。我通过以下证明了这是真的:

n = 0..3
d = [0, 90, 180, 181]
r = π / 180 * d[n]
c = cos(r)
a = acos(c)

以下是 d[n] 的评估结果:

  • d[0] returns a = 0.
  • d[1] returns a = π/2.
  • d[2] returns a = π.
  • d[3] returns a ~= 3.12....

这告诉我们 acos 的 return 值与反余弦的 range of usual principle values 保持一致:

0 ≤ acos(x) ≤ π

也与定义保持一致:

acos(cos(θ)) = θ


我已就 HLSL 内在函数与更常见语言相比缺乏详细文档的问题向 Microsoft 提供了反馈。