zoukankan      html  css  js  c++  java
  • Fixed数据类型

    http://www.jianshu.com/p/7b9498e58659

    unity shader fixed说明

    Shader中的数据类型
    有3种基本数值类型:float、half和fixed。
    这3种基本数值类型可以再组成vector和matrix,比如half3是由3个half组成、float4x4是由16个float组成。


    float:32位高精度浮点数。
    half:16位中精度浮点数。范围是[-6万, +6万],能精确到十进制的小数点后3.3位。
    fixed:11位低精度浮点数。范围是[-2, 2],精度是1/256。(这个具体精度有待确认,目前没找到可靠的解释,还有说cg中fixed是12位定点数,被所有fragment profile支持)
    数据类型影响性能
    精度够用就好。
    颜色和单位向量,使用fixed
    其他情况,尽量使用half(即范围在[-6万, +6万]内、精确到小数点后3.3位);否则才使用float。













    http://www.cppblog.com/wrhwww/archive/2010/07/29/121573.html


    在处理图形运算,特别是3D图形生成运算时,往往要定义一个Fixed数据类型,我称它为定点数,定点数其时就是一个整形数据类型,他的作用就是把所有数进行转换,从而得到相应类型的整型表达,然后使用定点数进行整行运算,取到最终值并将其转换回实际的基本数据类型。因此它是通过避免大量的浮点运算来加快图形处理的一个方式。



    现在来定义下定点数的转换法则,定点数有8位单字节转换或16位双字节转换:区别只是一个要8移位,一个要做16移位


    8位


    typedef long FIXED;                                              // long型定点类型


    #define itofx(i_x) ((i_x) << 8)                                  // 整转定点


    #define ftofx(f_x) (long)((f_x) * 256)                           // 浮点转定点


    #define dtofx(d_x) (long)((d_x) * 256)                           // 双精度转定点


    #define fxtoi(fx_x) ((fx_x) >> 8)                                // 定点转整


    #define fxtof(fx_x) ((float) (fx_x) / 256)                       // 定点转浮点


    #define fxtod(fx_x) ((double)(fx_x) / 256)                       // 定点转双精度


    #define Mulfx(fx_x,fx_y) (((fx_x) * (fx_y)) >> 8)                // 定点积得定点


    #define Divfx(fx_x,fx_y) (((fx_x) << 8) / (fx_y))                // 定点除得定点


    16位


    typedef int FIXED;                                               // long型定点类型


    #define itofx(i_x) ((i_x) << 16)                                 // 整转定点


    #define ftofx(f_x) (long)((f_x) * 65536)                         // 浮点转定点


    #define dtofx(d_x) (long)((d_x) * 65536)                         // 双精度转定点


    #define fxtoi(fx_x) ((fx_x) >> 16)                               // 定点转整


    #define fxtof(fx_x) ((float) (fx_x) / 65536)                     // 定点转浮点


    #define fxtod(fx_x) ((double)(fx_x) / 65536)                     // 定点转双精度


    #define Mulfx(fx_x,fx_y) (((fx_x) * (fx_y)) >> 16)               // 定点积得定点


    #define Divfx(fx_x,fx_y) (((fx_x) << 16) / (fx_y))               // 定点除得定点


     


    3D图形计算一般会用到16位的,2D图形计算一般会用到8位的,本着实用的原则定义定点数类型














    Fixed是业界使用最广的一种类型,他并没有在标准C或者其他语言中定义,程序员可以灵活的使用Fixed类型,可以定义自己想要的Fixed类型。那么什么是Fixed类型呢?Fixed类型是用来取代浮点,使用4字节的高2个字节表示整数位,低2个字节表示浮点位。每个字节有8个bit位,4个字节32个bit位,因此,我们把这种Fixed称为16.16Fixed。当然,也有使用24.8的Fixed,这就要看需求和精确度了。比如Fixed中的数字1,就是65536,也就是(1<<16)。这里用了位移公式,就是将1左移16位,也就是2个字节,左移16等于剩以65536,只不过位移来的非常快,快过加法。(这里理解不了就算了)比如数字32.5,等于(32<<16)|32768,等于32*65536+32768。为什么要这么麻烦呢?有了Fixed,就好像操作整数一样,都是整数运算了。Fixed的四舍五入也很简单,比如我们将X四舍五入到整数类型,就是(X+32768)>>16。32768就是半个Fixed的1,也就是浮点的0.5。右移16位就是除以65536,为的是将高2字节移到正常的整数位上。我都说晕了,以后慢慢解释给大家,呵呵。
        Fixed类型说了一堆,究竟来做什么的?


        比如上例中,Y轴每次都要偏移0.4,而这个数是个浮点,严重影响了运算速度。比如,我们后台有一个数,用来计量Y轴本次的坐标,就叫做变量YY吧。X每次都加1,也就是XX++,Y每次加0.4,也就是YY+=0.4。为了提高速度,我们将YY升级到Fixed类型,YY每次加Fixed的0.4,也就是0.4*65536=26214,然后再四舍五入到整数类型,即YY+=26214,Y=(YY+32768)>>16。这样,就得到了每次的整数Y,并且都是整数的加减和位运算,速度非常快
  • 相关阅读:
    Median Value
    237. Delete Node in a Linked List
    206. Reverse Linked List
    160. Intersection of Two Linked Lists
    83. Remove Duplicates from Sorted List
    21. Merge Two Sorted Lists
    477. Total Hamming Distance
    421. Maximum XOR of Two Numbers in an Array
    397. Integer Replacement
    318. Maximum Product of Word Lengths
  • 原文地址:https://www.cnblogs.com/nafio/p/9137464.html
Copyright © 2011-2022 走看看