c++ - 如何使用 glPolygonStipple 创建粗斜条纹?

标签 c++ opengl dithering stipple

我一定不明白 glPolygonStipple位排列。我认为这是一个简单的 32x32 位掩码。因此,如果我可以使用 unsigned int每行。例如,这段代码会产生(如预期的那样)一条粗的垂直条纹:

  static unsigned int halftone[32];
  for(static bool once = true;once;once=false)
  {
    for(int r = 0;r<32;r++)
    {
      halftone[r] = 65535;
    }
  }

制作:

vertical bits

  static unsigned int halftone[32];
  for(static bool once = true;once;once=false)
  {
    halftone[0] = 65535;
    for(int r = 1;r<32;r++)
    {
      halftone[r] = rol(halftone[r-1]);
    }
  }

哪里rolcircular bit shift :

template <typename INT> 
constexpr INT rol(INT val) {
    static_assert(std::is_unsigned<INT>::value,
                  "Rotate Left only makes sense for unsigned types");
    return (val << 1) | (val >> (sizeof(INT)*CHAR_BIT-1));
}

我可以通过添加 cout<<bitset<32>(halftone[r])<<endl; 来验证我得到正确的模式:

00000000000000001111111111111111
00000000000000011111111111111110
00000000000000111111111111111100
00000000000001111111111111111000
00000000000011111111111111110000
00000000000111111111111111100000
00000000001111111111111111000000
00000000011111111111111110000000
00000000111111111111111100000000
00000001111111111111111000000000
00000011111111111111110000000000
00000111111111111111100000000000
00001111111111111111000000000000
00011111111111111110000000000000
00111111111111111100000000000000
01111111111111111000000000000000
11111111111111110000000000000000
11111111111111100000000000000001
11111111111111000000000000000011
11111111111110000000000000000111
11111111111100000000000000001111
11111111111000000000000000011111
11111111110000000000000000111111
11111111100000000000000001111111
11111111000000000000000011111111
11111110000000000000000111111111
11111100000000000000001111111111
11111000000000000000011111111111
11110000000000000000111111111111
11100000000000000001111111111111
11000000000000000011111111111111
10000000000000000111111111111111

但是 OpenGL 正在生成:

diagonal bits

我将数组指针转换为 GLubyte当我传递给 glPolygonStipple

glPolygonStipple((GLubyte*)halftone);

我的理解有问题吗?这与一些glPixelStore有关吗?问题?

最佳答案

看起来您的 32 位值中的字节相对于 OpenGL 对掩码的期望进行了交换。

字节顺序由 GL_UNPACK_LSB_FIRST 像素存储参数控制,默认为 GL_FALSE。由于 LSB 首先出现在小端机器上,这很可能是您正在使用的机器,所以这是倒退的。

您可以通过更改值来修复它:

glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);

关于c++ - 如何使用 glPolygonStipple 创建粗斜条纹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30448029/

相关文章:

c++ - 为什么这个简单的 C++ C 风格字符串反转方法会抛出访问冲突异常?

opengl-es - 抖动 gouraud 着色的顶点色多边形以去除 strip

java - 使用自定义 ColorModel 减少颜色时 BufferedImage 禁用抖动?

c++ - 为什么在非默认参数之前不允许使用默认参数?

c++ - OpenGL - 加载多面的正确方法

c++ - 避免等待 SwapBuffers

c++ - glColor3f 仅颜色为红色

c++ - 使用自定义帧缓冲区时深度测试不起作用

wpf - 在 WPF v4 中但不在 v3.5 下的图像调整别名

c++ - 应用程序无法获取命令参数