hlsl中的半字下标

时间:2013-12-19 07:40:18

标签: shader hlsl subscript

我似乎无法自己解决这个问题,经过一些谷歌搜索后,我觉得是时候转向社区寻找答案了。

我在我正在使用的项目中有一些代码,我将提供一个非常简化的版本但它应该帮助我展示这个概念。

//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

1 个答案:

答案 0 :(得分:1)

在HLSL中,floathalf等标量类型是一维向量,只有.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)

什么都不应该改变。