2

我对opengl es(Android)有一个奇怪的问题。有些纹理绘制不正确,就像纹理坐标发生了变化,但其他纹理呈现正常。例如我有这个: 在此处输入图像描述

我明白了:

在此处输入图像描述

(简历和圆圈是使用相同纹理坐标/顶点绘制的其他纹理)

我像这样加载纹理:

 GLuint texture;
  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);

  if(alpha)glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) image_data);
  else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*) image_data);

并像这样渲染:

//int to fixed point
#define iX(x) (x<<16)
//float ti fixed point
#define fX(x) ((int)(x * (1  << 16)))

int square[12] = {
    fX(-0.5), fX(-0.5), 0,
    fX(0.5), fX(-0.5), 0,
    fX(-0.5), fX(0.5), 0,
    fX(0.5), fX(0.5), 0
};

int texCoords[8] = {
    fX(0), fX(0),
    fX(1), fX(0),
    fX(0),fX(1),
    fX(1),fX(1)
};

void Render(int type)
{

    if(type==RENDER_2D)gltviewOrtho();

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, id);
    glVertexPointer(3, GL_FIXED, 0, square);
    glTexCoordPointer(2, GL_FIXED, 0, texCoords);
    /////////////////////////////////////////////////////
    glPushMatrix();

    if(align==ALIGN_CENTER)glTranslatef(x,y,z);

    if(align==ALIGN_LEFT)glTranslatef(x-scalex/2,y,z);
    if(align==ALIGN_LEFT+ALIGN_TOP)glTranslatef(x-scalex/2,y+scaley/2,z);
    if(align==ALIGN_LEFT+ALIGN_BOTTOM)glTranslatef(x-scalex/2,y-scaley/2,z);

    if(align==ALIGN_RIGHT)glTranslatef(x+scalex/2,y,z);
    if(align==ALIGN_RIGHT+ALIGN_TOP)glTranslatef(x+scalex/2,y+scaley/2,z);
    if(align==ALIGN_RIGHT+ALIGN_BOTTOM)glTranslatef(x+scalex/2,y-scaley/2,z);

    if(align==ALIGN_BOTTOM)glTranslatef(x,y-scaley/2,z);
    if(align==ALIGN_TOP)glTranslatef(x,y+scaley/2,z);

    glScalef(scalex,scaley,0);
    glColor4f(r,g,b,a);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glPopMatrix();
    ////////////////////////////////////////////////////
    glDisable(GL_TEXTURE_2D);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);

    if(type==RENDER_2D)gltviewPerspective();


}
4

1 回答 1

3

上传纹理时的像素解包对齐为 4:这意味着每个纹理行应以 4 字节对齐开始。

如果您的数据被紧密打包,使用 250 像素宽的 RGB 位图需要 2 字节对齐:实际上每个位图行由 750 字节定义,而不是 4 的倍数。

本质上,纹理上传器忽略每行 2 个字节,因为它认为位图行长 752 个字节。

要解决您的问题,请在上传纹理之前设置像素对齐:

    glPixelStorei(GL_UNPACK_ALIGNMENT, 2)

如果您能够使用 NPOT 纹理,请不要浪费内存。

于 2012-06-29T14:58:13.033 回答