关于glPixelStorei()对齐的问题

时间:2015-09-02 19:14:33

标签: c opengl

此数组中的每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和我位图的长度之间存在任何关系。

有人能解释一下发生了什么吗?

1 个答案:

答案 0 :(得分:1)

回到一些历史规范文档(glBitmap()是一个非常过时的调用)后,位图的对齐规则是(OpenGL 2.1规范的第136页):

k = a * ceiling(w / (8 * a))

其中:

  • w是宽度,假设GL_UNPACK_ROW_LENGTH未设置。
  • aGL_UNPACK_ALIGNMENT
  • 的值
  • k是每行使用的字节数。请注意,无论参数如何设置,每行始终至少从字节边界开始。

将示例中的值替换为w = 8,我们得到:

  • 每行1个字节,GL_UNPACK_ALIGNMENT为1。
  • 每行2个字节,GL_UNPACK_ALIGNMENT为2。

w = 10,我们得到:

  • 每行2个字节,GL_UNPACK_ALIGNMENT为1。
  • 每行2个字节,GL_UNPACK_ALIGNMENT为2。

基于此,除非您还设置了其他GL_UNPACK_*参数,否则无论GL_UNPACK_ALIGNMENT是1还是2,您都应获得宽度10的相同输出。如果不是这样,那么看起来像是OpenGL实现中的一个错误。