2012-03-20 2 views
0

Я пытаюсь отобразить текстуру на квадрате, используя opengl es 1, используя ndk. Я использую эти «хаки» для загрузки png из apk: http://www.anddev.org/ndk_opengl_-_loading_resources_and_assets_from_native_code-t11978.htmlТекстура OpenGL 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

Хм, я не» Думаю, что это должно произойти на основе опубликованного кода. Существуют ли какие-либо другие переменные envend env, которые вы устанавливаете в отношении текстурирования? Что произойдет, если вы установите 'glTexParameter (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP), glTexParameter (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);'? – Tim

+0

Спасибо, я попытался сыграть с glTexParameter, без каких-либо успехов, затем снова проверил код, сыграв с текстурами, если обнаружил, что проблема в том, что у моих изображений нет альфа-канала. Проблема должна быть в функции загрузки png. –

+0

Вы уверены, что координаты текстуры в OpenGL - это карта? – mr5

ответ

0

Проблема была определенно функция загрузки PNG. добавить тест, чтобы проверить, если изображение содержит альфа-канал, используя Libpng:

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); 
Смежные вопросы