2012-06-29 225 views
2

我有一個opengl es(Android)的奇怪問題。有些紋理不繪製正確,它像紋理座標已更改,但其他紋理渲染正常。例如,我有這樣的: enter image description hereOpengl ES紋理不繪製正確

我得到這個:

enter image description here

(簡歷和圓是溺水的精細與同一紋理座標/頂點其他紋理)

我加載紋理像這樣:

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(); 


} 
+3

我敢打賭,*寬* * 3不是4的倍數! (並且紋理是RGB而不是RGBA) – Luca

+0

omg我怎麼錯過了!我在代碼中搜索幾個小時,我總是忘記了鍋的紋理! – SteveL

+0

這不是因爲POT紋理,而是因爲像素傳輸掃描線長度(調查glPixelStore)。 – Luca

回答

3

像素解包對準在上傳紋理是4:這意味着每個紋理線應使用字節對齊開始4.

如果數據打包得很緊密,使用250像素寬的RGB位圖需要2個字節對​​齊:實際上,每個位圖行由750個字節定義,不是4的倍數。

本質上,紋理上傳器在每行忽略2個字節,因爲它認爲位圖行長752個字節。

解決您的問題,設置像素對齊上傳質地前:

glPixelStorei(GL_UNPACK_ALIGNMENT, 2) 

,如果你能使用NPOT紋理不要浪費內存。

+0

非常感謝您的anwser,我試過了,我現在可以加載npot紋理,我認爲這是不可能在opengles 1.0/1.1由於表現問題。 – SteveL