OpenGL ES纹理在4列和行中重复

时间:2012-03-20 19:35:59

标签: android opengl-es android-ndk

我正在尝试使用ndk使用opengl es 1在正方形上显示纹理。 我正在使用这个“黑客”从apk加载一个png: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 :(得分:0)

问题绝对是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”和“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);