2012-03-20 33 views
0

我試圖在使用ndk的opengl es 1的正方形上顯示紋理。 我使用這個「黑客」從apk中加載PNG:http://www.anddev.org/ndk_opengl_-_loading_resources_and_assets_from_native_code-t11978.htmlOpenGL ES紋理在4列和行中複製

這似乎工作正常。 當我想將紋理應用到我的四邊形時,紋理看起來是重複的。

enter image description here

經過一番研究,我認爲這個問題是從我的渲染代碼來:

//the order is correct even if it is not in the numeric order 
GLfloat vertexBuffer[] = { 
    _vertices[0].x, _vertices[0].y, 
    _vertices[3].x, _vertices[3].y, 
    _vertices[1].x, _vertices[1].y, 
    _vertices[2].x, _vertices[2].y, 
}; 

GLfloat texCoords[] = { 
    0.0, 1.0, // left-bottom 
    1.0, 1.0, // right-bottom 
    0.0, 0.0, // left-top 
    1.0, 0.0 // right-top 
}; 

glBindTexture(GL_TEXTURE_2D, _texture->getTexture()); 
glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glVertexPointer(2, GL_FLOAT, 0, vertexBuffer); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glBindTexture(GL_TEXTURE_2D, 0); 
+0

嗯,我不不要認爲應該根據發佈的代碼進行。有沒有其他的opengl env變量與紋理有關?如果您設置了'glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameter(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);'? – Tim 2012-03-20 21:20:39

+0

謝謝,我試圖玩glTexParameter,沒有成功,然後我再次檢查代碼與紋理一起玩,如果我發現問題是我的圖像沒有alpha通道。這個問題必須在png加載函數中。 – 2012-03-21 08:01:23

+0

你確定OpenGL中的紋理座標是這樣的映射嗎? – mr5 2013-03-15 16:32:19

回答

0

問題是definitly是PNG加載功能。 我添加一個測試,以檢查圖像使用的libpng包含alpha通道:

bool hasAlpha; 
switch (info_ptr->color_type) { 
    case PNG_COLOR_TYPE_RGBA: 
     hasAlpha = true; 
     break; 
    case PNG_COLOR_TYPE_RGB: 
     hasAlpha = false; 
     break; 
    default: 
     png_destroy_read_struct(&png_ptr, &info_ptr, NULL); 
     zip_fclose(file); 
     return TEXTURE_LOAD_ERROR; 
} 

而我改變了glTexImage2D參數「internalformat」和「格式」:

glTexImage2D(GL_TEXTURE_2D, 0, hasAlpha ? GL_RGBA : GL_RGB, width, height, 0, hasAlpha ? GL_RGBA : GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*) image_data);