【问题标题】:Subscript on half-type in hlslhlsl中半类型的下标
【发布时间】:2013-12-19 17:29:09
【问题描述】:

我自己似乎无法解决这个问题,在谷歌上搜索了一些我空白的地方后,我认为是时候转向社区寻找答案了。

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

//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) 这样的事情?因为这就是查看结果时的样子。

无论如何,我感谢有关代码如何工作的建议或解释,以及用.rrrhalf 下标的含义以及对可能下标的任何参考将是一份精美的圣诞礼物。 :P

【问题讨论】:

  • 你的目标DX和着色器模型版本是什么?这个着色器可以正常工作吗?
  • 我实际上对hlsl 和一般使用它的渲染器有点陌生。但它针对 DX9 及更高版本。它确实有效,并且似乎达到了预期的效果,唯一的问题是这个color 在延迟阶段用于对镜面反射进行着色,当我使用mask.rrr 时,我得到了超高镜面反射,这就是我怀疑的原因mask.rrr 的作用类似于乘以该值。所以主要的失败部分是我对mask.rrr下标的理解。

标签: shader hlsl subscript


【解决方案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)

什么都不应该改变。

【讨论】:

  • 当然,您是对的,我很高兴能将其清除。我曾使用类似的语言工作过,但远非专家。您可能会怀疑我的结果的原因很快就会证明与.xxx 部分无关,但实际上它使用了一个我认为它没有使用的壮观方程,所以我想这一切都归结为我一般对hlsl 缺乏了解以及对代码的误解。我让它按预期工作,我标记你的答案解决了我的问题,因为我现在真的明白这部分是如何工作的。谢谢!
猜你喜欢
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多