游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1774|回复: 9

好久没有技术文章了,偶来发篇吧。

[复制链接]

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2006-8-18 15:19:00 | 显示全部楼层 |阅读模式
地球人都知道现在的dx内部都开始支持16位的浮点了, also known as float16(half)
这种类型本身并不是标准IEEE里的,不同的平台也有不同的实现方法。
就偶这几天hardcore Xenon的程序来看,dx内部的16位float结构如下:
|0100 0010 0010 0100|
s                                       
   |exp|
           | mantissa  |
假设0100 0010 0010 0100是一个16位的浮点数,那么从高位的第一位仍然是sign位
然后有4位的exp和11位的mantissa。
4位的exp是直接截低4位就ok了
mantissa则是截高11位,这点需要注意,模拟的c/c++ code如下:
u16 tofloat16(float f)
{
        u32 *i = (u32 *)&f;
        u32 sign = (*i >> 31) & 0x1;
        u32 exponent = ((*i >> 23) & 0xff) - 0x7f;
        u32 mantissa = (*i) & 0x7fffff;
       
        exponent += 0x7;
        u16 ret = ((sign & 0x1) << 15);
        ret |= (exponent & 0xf) << 11;
        ret |= (mantissa  >> 13) & 0x7ff;
        return ret;
}

u32 tofloat32(u16 f)
{
        u16 *i = (u16 *)&f;
        u32 sign = (*i >> 15) & 0x1;
        u32 exponent = ((*i >> 11) & 0xf) - 0x7;
        u32 mantissa = (*i) & 0x7ff;

        exponent += 0x7f;
        u32 ret = ((sign & 0x1) << 31);
        ret |= (exponent & 0xff) << 23;
        ret |= (mantissa << 13) & 0x7fffff;
        return ret;
}

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-8-18 17:35:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

8错8错。。。顶!

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2006-8-18 18:36:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

谢谢分享!不过我应该不会去用到16位的浮点数。

7

主题

438

帖子

438

积分

中级会员

Rank: 3Rank: 3

积分
438
发表于 2006-8-18 22:52:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

正在想,楼主会不会是我的一个同事……

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2006-8-19 08:32:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

仿佛HDR用的是16bit float?

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2006-8-19 10:02:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

拖鞋又出现了。
其实float16也叫half。
为什么使用它的原因是因为速度更快。更小的存储。而且NV的卡只支持fp16的纹理可以使用filter。 fp32则不行。

要使用这个half。用OpenEXR里那个就可以了。另外HDR的话。只要>8bit的就够了。short的也可以。float32也可以

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-8-19 23:55:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

有个疑问,ret |= (mantissa  >> 13) & 0x7ff;
fp32里面是23位的mantissa,fp16里面是11位,那应该截去后面的12位,也就是右移12位,这里为什么要“ >> 13 bit”??

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
 楼主| 发表于 2006-8-21 10:01:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

呵呵,试过就知道了,为什么是>>13,相信偶,没错的。

5

主题

686

帖子

697

积分

高级会员

Rank: 4

积分
697
QQ
发表于 2006-8-21 17:25:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

试过了……SDK里面也有说,原来是e5s10的格式……

89

主题

4036

帖子

4132

积分

论坛元老

Rank: 8Rank: 8

积分
4132
发表于 2006-8-22 00:35:00 | 显示全部楼层

Re:好久没有技术文章了,偶来发篇吧。

专业灌水。
友情一顶。
顺便顶帖子。再顺便推销一下 OpenEXR
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 04:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表