Lode 的计算机图形学教程

XOR 纹理

目录

返回目录

简介

XOR 纹理是一种非常容易生成且效果不错的纹理。但由于使用过于频繁,在 demo 或 intro 作品中并不是好的选择。它对游戏也没什么用处,除非你想要一些花哨的地板瓷砖。它真正有用的地方在于:测试你刚刚编写的纹理映射器——当你想快速测试一个图案,又不想加载图像文件或编写更复杂的纹理生成代码时。

这是一篇极短的文章,但在纹理生成系列中不能缺少 XOR 纹理的介绍。

XOR 纹理

XOR 纹理的生成非常简单,只需对当前像素的 x 坐标和 y 坐标进行异或运算。C++ 中的 '^' 运算符就是 XOR 运算符。

int main(int argc, char *argv[])
{
  screen(256, 256, 0, "The XOR Texture");

  for(int y = 0; y < h; y++)
  for(int x = 0; x < w; x++)
  {
    Uint8 c = x ^ y;
    pset(x, y, ColorRGB(c, c, c));
  }

  redraw();
  sleep();
  return 0;
}

就这些,运行后可以看到 XOR 纹理:

XOR 纹理

不过有 3 点需要注意:

1) 纹理的尺寸应为 2 的幂次,否则效果不够好:



2) 颜色分量值范围为 0 到 255。当纹理尺寸为 2 的幂次时,XOR 运算生成的最大颜色值等于纹理的尺寸。因此,若 XOR 图案尺寸小于 256(例如仅 64),则会太暗(左图)。将颜色值乘以 4 可以恢复亮度(右图):



3) 反之,若尺寸大于 256(例如 512),则需确保颜色值不超过 256。可以对 256 取模,但这样就不是真正的 XOR 图案了。更好的做法是除以 2。无论如何,使用大于 256×256 的 XOR 纹理并不会提升质量,因为没有足够多的不同颜色值,除非使用每通道位数更多的颜色模式。不过谁会想生成一个 1024×1024 的 XOR 纹理呢。

XOR 运算符取两个整数的二进制值,对每对对应位进行二进制 XOR 运算。XOR(异或)在两个位不同时返回 1,相同时返回 0:"位 a 为 1 或位 b 为 1,但不能同时为 1"。换句话说,它对每对对应位应用以下真值表:

XOR
位_a
位_b
结果
0
0
0
0
1
1
1
0
1
1
1
0

对整数的每一位都进行此运算,从而产生大量可能的结果值。

例如,5 XOR 13 = 8,因为二进制 0101 XOR 1101 = 1000。

颜色

也可以为 R、G、B 使用不同的值来尝试彩色 XOR 纹理。例如:

int main(int argc, char *argv[])
{
  screen(256, 256, 0, "The XOR Texture");

  ColorRGB color;

  for(int y = 0; y < h; y++)
  for(int x = 0; x < w; x++)
  {
    Uint8 c = (x ^ y);
    color.r = 255 - c;
    color.g = c;
    color.b = c % 128;
    pset(x, y, color);
  }

  redraw();
  sleep();
  return 0;
}



甚至可以将 XOR 值用作 HSVtoRGB 函数的色相……

int main(int argc, char *argv[])
{
  screen(256, 256, 0, "The XOR Texture");

  ColorRGB color;

  for(int y = 0; y < h; y++)
  for(int x = 0; x < w; x++)
  {
    Uint8 c = (x ^ y);
    color = HSVtoRGB(ColorHSV(c, 255, 255));
    pset(x, y, color);
  }

  redraw();
  sleep();
  return 0;
}



AND 与 OR

AND 和 OR 运算符也能生成类似的纹理。

XOR 运算符在两个位不同时返回 1:

XOR
位_a
位_b
结果
0
0
0
0
1
1
1
0
1
1
1
0

AND 运算符只有当两个位都为 1 时才返回 1(位 a 与位 b 均为真)

AND
位_a
位_b
结果
0
0
0
0
1
0
1
0
0
1
1
1

OR 运算符在任意一个或两个位为 1 时返回 1(位 a 或位 b 为真)

OR
位_a
位_b
结果
0
0
0
0
1
1
1
0
1
1
1
1

C++ 中 AND 运算符用 '&' 表示,OR 运算符用 '|' 表示,将 '^' 替换为这些运算符即可。以下分别是 XOR、AND 和 OR 的结果:



AND 纹理较暗是合理的,因为它只在一种情况下返回 1。OR 纹理较亮,因为它在很多情况下都返回 1。XOR 纹理与 AND 纹理之和即为 OR 纹理。

总结

本文展示了创建 XOR 纹理是多么简单,这使得 XOR 纹理非常适合用来测试纹理渲染器是否正常工作。但它不适合用于艺术创作或游戏等场合。

这里将 XOR 图案用作 3D 纹理(x ^ y ^ z),测试星球纹理渲染器是否正常工作:




最后编辑:2004 年

版权所有 (c) 2004-2007 Lode Vandevenne,保留所有权利。