我实现了昼/夜着色器,该着色器是基于仅照亮面向方向光源的对象侧面上的像素而建立的。我根据定向光的位置与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
会返回什么。
在数学上,我知道反余弦应该给我一个角度,以弧度为单位,角度为-1
和1
,而余弦应该给我一个值,介于-1
和{{1 }}从弧度的角度来看。
documentation指出遵循该想法的1
的输入值应介于-1
和1
之间,但是它没有告诉我返回值是否是acos
,0 - π
,-π - π
或类似范围。
返回值
x参数的反余弦。
类型说明
名称[模板类型]'组件类型'大小
x [标量,向量或矩阵]'float'any
ret [与输入x相同]'浮动'与输入x相同的尺寸
0 - 2π
确实没有给我一种非常容易测试的方法,所以我想知道是否有人对此有任何文档。
HLSL函数HLSL
的返回范围是多少?
答案 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内在函数的详细文档的反馈。