此数组中的每2个值代表16个像素。 (每个元素8个二进制值)
GLubyte character[24] = {
0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xff, 0x00, 0xff, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0xc0, 0x00,
0xff, 0xc0, 0xff, 0xc0
};
这是我的代码来渲染我的位图。
void init(){
glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
}
void render(){
glBitmap(8, 12, 0.0, 11.0, 0.0, 0.0, character);
}
但是当我将glBitmap(8等)更改为glBitmap(10等)时,它无法正常工作。
要使它工作,我需要改变,
glPixelStorei(GL_UNPACK_ALIGNMENT, 2);
到
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
我的问题是,我不知道为什么会这样......
我只知道
GL_UNPACK_ALIGNMENT, 1
告诉OpenGL在没有对齐的情况下转到下一个地址。
我没有看到将ALGINMENT设置为1和我位图的长度之间存在任何关系。
有人能解释一下发生了什么吗?
答案 0 :(得分:1)
回到一些历史规范文档(glBitmap()
是一个非常过时的调用)后,位图的对齐规则是(OpenGL 2.1规范的第136页):
k = a * ceiling(w / (8 * a))
其中:
w
是宽度,假设GL_UNPACK_ROW_LENGTH
未设置。a
是GL_UNPACK_ALIGNMENT
。k
是每行使用的字节数。请注意,无论参数如何设置,每行始终至少从字节边界开始。将示例中的值替换为w = 8
,我们得到:
GL_UNPACK_ALIGNMENT
为1。GL_UNPACK_ALIGNMENT
为2。和w = 10
,我们得到:
GL_UNPACK_ALIGNMENT
为1。GL_UNPACK_ALIGNMENT
为2。基于此,除非您还设置了其他GL_UNPACK_*
参数,否则无论GL_UNPACK_ALIGNMENT
是1还是2,您都应获得宽度10的相同输出。如果不是这样,那么看起来像是OpenGL实现中的一个错误。