“非幂二纹理”是什么意思?

时间:2014-03-11 17:46:31

标签: c++ opengl

"非二次力量纹理"意思?我看了this tutorial并且遇到了一些二进制操作("<<",">>"," ^", "〜"),但我不明白他们在做什么。 例如,代码如下:

GLuint LTexture::powerOfTwo(GLuint num)
{
    if (num != 0)
    {
        num--;
        num |= (num >> 1); //Or first 2 bits
        num |= (num >> 2); //Or next 2 bits
        num |= (num >> 4); //Or next 4 bits
        num |= (num >> 8); //Or next 8 bits
        num |= (num >> 16); //Or next 16 bits
        num++;
    }
    return num;
}

我非常想了解这项行动。同样,我读了this。很短的文章。我想看看使用的例子,但我没有找到。我做了测试:

int a = 5;
a <<= 1; //a = 10
a = 5;
a <<= 2; //a = 20
a = 5;
a <<= 3; //a = 40

好的,这就像乘以二,但是

int a = 5;
a >>= 1; // a = 2 Whaat??

4 个答案:

答案 0 :(得分:0)

http://lazyfoo.net/tutorials/OpenGL/08_non_power_of_2_textures/index.php所述 powerOfTwo将接受参数并找到最接近2的幂数。

 GLuint powerOfTwo( GLuint num );
    /*
    Pre Condition:
     -None
    Post Condition:
     -Returns nearest power of two integer that is greater
    Side Effects:
     -None
    */

让我们测试一下:

num = 60(十进制),其二进制数为111100

    num--;                                   .. 59  111011
    num |= (num >> 1); //Or first 2 bits     011101 | 111011 = 111111
    num |= (num >> 2); //Or next 2 bits      001111 | 111111 = 111111
    num |= (num >> 4); //Or next 4 bits      000011 | 111111 = 111111
    num |= (num >> 8); //Or next 8 bits      000000 | 111111 = 111111
    num |= (num >> 16); //Or next 16 bits    000000 | 111111 = 111111
    num++;                                   ..63+1 = 64

输出64。

对于num = 5:num-1 = 4(二进制0100),在所有num |= (num >> N)之后它将是0111或7十进制)。然后num + 1等于8.

答案 1 :(得分:0)

在C ++中,<<=是&#34;左二进制移位&#34;赋值算子;左边的操作数被视为二进制数,位移到左边,零位插入右边。

>>=是正确的二元转换;位被移动到右边并且#34;脱落&#34;右端,所以它就像2除法(每个位)但截断。顺便说一下,对于负有符号整数,在左端移入另外的1位(&#34;算术右移&#34;),这可能是令人惊讶的;对于正有符号整数或无符号整数,0位在左侧移位(&#34;逻辑右移&#34;)。

&#34;两个人的权力&#34;是由1:2,4,8,16,32连续倍增产生的数字......大多数图形硬件更喜欢使用纹理贴图,其大小为2。

答案 2 :(得分:0)

您应该知道我们的计算机中的数据在二进制系统中表示,其中数字是1或0。 例如,数字10十进制= 1010二进制。 (1 * 2 ^ 3 + 0 * 2 ^ 2 + 1 * 2 ^ 1 + 0 * 2 ^ 0)。

我们现在就开始行动。

二进制| OR表示只要您有至少一个1,输出将为1。

  1010
| 0100
------
  1110

~NO表示否定,即所有0都变为1,所有1变为0。

~ 1010
------
  0101

^ XOR表示你将一对1和0转换为1.所有其他组合都将0作为输出。

  1010
^ 0110
------
  1100

位移。

N >> x表示我们将数字N,x位“滑动”到右侧。

1010 >> 1 = 0101(0) // zero in the brackets is dropped,
                       since it goes out of the representation = 0101
1001 >> 1 = 0100(1) // (1) is dropped = 0100

&LT;&LT;表现方式相同,只是相反的方向。

1000 << 1 = 0001

由于二进制系统中的数字表示为2的幂,因此将一个或另一个方向移位将导致乘以或除以2.

答案 3 :(得分:0)

设num = 36.首先减去1,得到35.在二进制中,这是100011。

右移1个位置给出10001(最右边的数字消失)。用num进行按位或者给出:

 100011
  10001
-------
 110011

请注意,这样可以确保左侧有两个1。

现在右移2个位置,给出1100.Bitwise Or:

 110011
   1100
-------
 111111

这确保了左边四个1。

依此类推,直到该值完全从最左边的1填充。

加1,得到1000000,2的幂。

此过程总是产生2的幂,并且您可以检查它是否刚刚高于num的初始值。