"非二次力量纹理"意思?我看了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??
答案 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的初始值。