我有一個opengl es(Android)的奇怪問題。有些紋理不繪製正確,它像紋理座標已更改,但其他紋理渲染正常。例如,我有這樣的: Opengl ES紋理不繪製正確
我得到這個:
(簡歷和圓是溺水的精細與同一紋理座標/頂點其他紋理)
我加載紋理像這樣:
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不是4的倍數! (並且紋理是RGB而不是RGBA) – Luca
omg我怎麼錯過了!我在代碼中搜索幾個小時,我總是忘記了鍋的紋理! – SteveL
這不是因爲POT紋理,而是因爲像素傳輸掃描線長度(調查glPixelStore)。 – Luca