返回反余弦值吗?

时间:2019-01-29 03:58:59

标签: math hlsl

我实现了昼/夜着色器,该着色器是基于仅照亮面向方向光源的对象侧面上的像素而建立的。我根据定向光的位置与3D空间中像素位置之间的单位矢量进行计算:

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会返回什么。


在数学上,我知道反余弦应该给我一个角度,以弧度为单位,角度为-11,而余弦应该给我一个值,介于-1和{{1 }}从弧度的角度来看。

documentation指出遵循该想法的1的输入值应介于-11之间,但是它没有告诉我返回值是否是acos0 - π-π - π或类似范围。

  

返回值

     

x参数的反余弦。

     

类型说明

     

名称[模板类型]'组件类型'大小
  x [标量,向量或矩阵]'float'any
  ret [与输入x相同]'浮动'与输入x相同的尺寸

0 - 2π确实没有给我一种非常容易测试的方法,所以我想知道是否有人对此有任何文档。


HLSL函数HLSL的返回范围是多少?

1 个答案:

答案 0 :(得分:0)

我对此主题进行了一些测试,发现acos的HLSL版本返回的值介于0π之间。我通过以下方法证明这是正确的:

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

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

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

这告诉我们acos的返回值与反余弦的range of usual principle values保持真实:

  

0≤acos(x)≤π

也与定义保持一致:

  

acos(cos(θ))=θ


我已经向Microsoft提供了有关与更常见的语言相比缺少有关HLSL内在函数的详细文档的反馈。