我似乎无法自己解决这个问题,经过一些谷歌搜索后,我觉得是时候转向社区寻找答案了。
我在我正在使用的项目中有一些代码,我将提供一个非常简化的版本但它应该帮助我展示这个概念。
//hlsl code
...
ps_main(...) {
half mask = function_calculating_mask_and_returning_half();
half3 color = condition ? a_previously_defined_half3 : mask.rrr;
}
这里的最后一行让我很困惑,尤其是mask.rrr
它真正做到了什么?据我所知,它会返回一个half3 (mask, mask, mask)
,但我似乎从中获得了很高的价值,如果我将其更改为mask.r
或只是mask
它会给我一个结果更低的价值,(据我所知)。
是不是像half3(mask^3, mask^3, mask^3)
那样呢?因为这就是看结果时的样子。
无论如何,我感谢关于代码如何工作以及用half
下标.rrr
的含义的建议或解释,以及对可能下标的任何参考将是一个整洁的圣诞礼物。 :P
答案 0 :(得分:1)
在HLSL中,float
和half
等标量类型是一维向量,只有.x
(或.r
)组件。此订阅通常用于类型转换:
float s = .5;
float3 v1 = s.xxx; // v is (0.5, 0.5, 0.5), or even
float3 v2 = 0.5.xxx; // :)
还有从向量到标量的隐式转换,它们采用第一个组件。请记住,组件的存储方式类似于 RGBA (或 XYZW ):
float3 v = {0.5, 0.6, 0.7}
float s1 = v; // s1 is 0.5 (implicit conversion)
float s2 = v.x // s2 is 0.5 (explicit conversion)
float s3 = v.xxx /* s3 is 0.5 because we've just created float3(v.x, v.x, v.x)
and then implicitly taken it's X component, which is v.x */
这是它的工作原理。尝试修改您的代码:
half3 color = condition ? a_previously_defined_half3 : half3(mask, mask, mask)
什么都不应该改变。