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バイトの配置が必要です。実際、各ビットマップ行は4の倍数ではない750バイトで定義されます。

基本的に、テクスチャアップローダーは、ビットマップ行が752バイト長いと見なすため、各行で2バイトを無視します。

この問題を解決するには、テクスチャをアップロードする前にピクセルの配置を設定します。

    glPixelStorei(GL_UNPACK_ALIGNMENT, 2)

NPOTテクスチャを使用できる場合は、メモリを無駄にしないでください。

于 2012-06-29T14:58:13.033 に答える