金属着色器语言:为什么相似指令的结果不同?

lok*_*oki 0 metal

在金属着色器下,为什么这两行的工作原理不同:

float b = (color.rgb * float3(1,1.1,0.9)).x;
Run Code Online (Sandbox Code Playgroud)

和

float b = dot(color.rgb, float3(1,1.1,0.9));
Run Code Online (Sandbox Code Playgroud)

war*_*enm 6

这些是不同的操作。*是分量乘法,而dot是向量点积。

假设color定义为float3(0.6f, 0.7f, 0.8f).

然后第一个表达式(color.rgb * float3(1.0f, 1.1f, 0.9f)).x首先将向量按分量相乘,产生向量(0.6, 0.77, 0.72),然后取第一个分量 ( x),因此结果为0.6。

第二个表达式dot(color.rgb, float3(1.0f, 1.1f, 0.9f))是向量按分量乘积的总和(通常称为点积或内积),因此结果是(0.6 * 1.0 + 0.7 * 1.1 + 0.8 * 0.9),恰好是2.09。