Я не должен понимать glPolygonStipple
битовое расположение. Я думал, что это была простая битовая маска 32×32. Поэтому, если бы я мог использовать 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;
}
}
Производство:
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]);
}
}
где rol
это круговой битовый сдвиг:
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 производит:
Я приведу указатель массива на GLubyte
когда я перейду к glPolygonStipple
glPolygonStipple((GLubyte*)halftone);
Что-то не так с моим пониманием? Это связано с некоторыми glPixelStore
проблема?
Похоже, что байты в ваших 32-битных значениях поменялись местами относительно того, что OpenGL ожидает от маски.
Порядок байтов контролируется GL_UNPACK_LSB_FIRST
параметр хранения пикселей, который GL_FALSE
по умолчанию. Поскольку LSB сначала находится на машине с прямым порядком байтов, которая, скорее всего, то, что вы используете, это наоборот.
Вы можете исправить это, изменив значение:
glPixelStorei(GL_UNPACK_LSB_FIRST, GL_TRUE);