如何将浮点数转换为整数并保留位值?

5

我有一个float4作为计算着色器的输入,其中3个浮点数真的是浮点数,而第四个是两个uint位移后合并在一起的。我该如何将浮点数转换为uint,同时保留位序而不是数字值?

在c ++方面,我解决了这个问题,通过创建一个uint指针,将其填充所需的数字,然后将指针作为float指针传递。然而,在HLSL中,虽然它与 c / c++ 相似,但没有指针,所以我无法解决此问题 :|


12
嘿 @karli-raudsepp,你应该回去接受一些针对你的问题给出的答案。人们费力回答了你的问题,所以你至少可以展示哪些答案对未来读者最有帮助。 - Hans Z
我并不是一个C++专家,但你能不能将float转换为由两个short组成的结构体呢? - tskuzzy
2个回答

9
在HLSL中,您应该能够执行以下操作(假设您要获取的值在f4.w中):
uint ui = asuint( f4.w );
uint ui1 = ui & 0xffff;
uint ui2 = ui >> 16;

基本上看起来asuint内置函数是你的好朋友 :)

如果一个答案对你有帮助,那么你应该考虑接受它。 - phuclv
@LưuVĩnhPhúc: 我怀疑他不会注意到……我是收到评论通知的人,针对我的回答;) - Goz
@Goz 实际上,提问者和回答者都会收到有关其问题/答案的评论的通知,当然还有被标记的人,:) - phuclv
真的吗?当别人评论我的问题的答案时,我没有收到任何通知... - Goz

2
您可以使用联合体。
float f;  // you float value is here

union X  
{  
    float f;  
    short int a[2];  
} x;  
x.f = f;

int i1 = x.a[0];  // these are your ints  
int i2 = x.a[1];

1
嗯,浮点数只有32位。我认为你想用“short”而不是“int”。 - user1157123
在 C++ 中,写入联合的一个字段并读取另一个字段是未定义的行为。正确的方法是使用 memcpy。 - Raildex
写入一个联合的字段,然后读取另一个字段,这就是联合的整个目的,在C++中这种行为是绝对定义好的。 - Hashman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接