Текстура OpenGL ES дублируется в 4 столбца и строки - PullRequest
0 голосов
/ 20 марта 2012

Я пытаюсь отобразить текстуру на квадрате, используя opengl es 1, используя ndk.Я использую это "hacks", чтобы загрузить png из apk: http://www.anddev.org/ndk_opengl_-_loading_resources_and_assets_from_native_code-t11978.html

Это, кажется, работает нормально.Когда я хочу применить текстуру к моему четырехугольнику, текстура кажется дублированной.

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

1 Ответ

0 голосов
/ 21 марта 2012

Проблема была определенно в функции загрузки 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" и "format":

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