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

时间:2015-05-26 01:20:30

标签: 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问题有关吗?

1 个答案:

答案 0 :(得分:2)

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

字节顺序由GL_UNPACK_LSB_FIRST像素存储参数控制,默认情况下为GL_FALSE。由于LSB首先在一台小端机器上运行,这很可能是你正在使用的,这是倒退的。

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

glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);