Android OpenGL glTexImage2D未绘制

Android OpenGL glTexImage2D未绘制,android,opengl-es,android-ndk,Android,Opengl Es,Android Ndk,我正在尝试使用ndk在opengl纹理上显示图像。 我有一个图像结构: struct image { png_uint_32 imWidth, imHeight; //real size png_uint_32 glWidth, glHeight; //size for OpenGL int bit_depth, color_type; char* data; //data RGB/RGBA }; 我正在阅读图片: image imJpeg = readJpeg("/data/data/com

我正在尝试使用ndk在opengl纹理上显示图像。 我有一个图像结构:

struct image {
png_uint_32 imWidth, imHeight; //real size
png_uint_32 glWidth, glHeight; //size for OpenGL
int bit_depth, color_type;
char* data; //data RGB/RGBA
};
我正在阅读图片:

image imJpeg = readJpeg("/data/data/com.lodoss.app/app_imageDir/0.jpg");
readJpeg实现:

static int reNpot(int w) {
    bool NON_POWER_OF_TWO_SUPPORTED = false;
    if (NON_POWER_OF_TWO_SUPPORTED) {
        if (w % 2) w++;
    } else {
        if (w <= 4) w = 4;
        else if (w <= 8) w = 8;
        else if (w <= 16) w = 16;
        else if (w <= 32) w = 32;
        else if (w <= 64) w = 64;
        else if (w <= 128) w = 128;
        else if (w <= 256) w = 256;
        else if (w <= 512) w = 512;
        else if (w <= 1024) w = 1024;
        else if (w <= 2048) w = 2048;
        else if (w <= 4096) w = 4096;
    }
    return w;
}

//read JPEG from file
static image readJpeg(const char* fileName) {
    image im;
    FILE* file = fopen(fileName, "rb");

    struct jpeg_decompress_struct cinfo;
    struct my_error_mgr jerr;

    cinfo.err = jpeg_std_error(&jerr.pub);
    jerr.pub.error_exit = my_error_exit;
    if (setjmp(jerr.setjmp_buffer)) {
        jpeg_destroy_decompress(&cinfo);
        return im;
    }

    jpeg_create_decompress(&cinfo);
    jpeg_stdio_src(&cinfo, file);

    //получаем данные о картинке
    jpeg_read_header(&cinfo, TRUE);
    jpeg_start_decompress(&cinfo);

    im.imWidth = cinfo.image_width;
    im.imHeight = cinfo.image_height;
    im.glWidth = reNpot(im.imWidth);
    im.glHeight = reNpot(im.imHeight);

    //JPEG не имеет прозрачности так что картинка всегда 3х-байтная (RGB)
    int row = im.glWidth * 3;
    im.data = new char[row * im.glHeight];

    //построчно читаем данные
    unsigned char* line = (unsigned char*) (im.data);
    while (cinfo.output_scanline < cinfo.output_height) {
        jpeg_read_scanlines(&cinfo, &line, 1);
        line += row;
    }

    //подчищаем
    jpeg_finish_decompress(&cinfo);
    jpeg_destroy_decompress(&cinfo);

    return im;
}
引擎指向我的图像

但什么也没发生。没有错误,也没有显示图像。只有黑屏
为什么会发生这种情况?

GLTEXAGE2D将像素数据复制到纹理中。它不会渲染任何东西。您需要渲染一些几何体并将纹理应用到其中的代码。@fadden您能告诉我如何渲染纹理吗?您最好找到OpenGL ES教程。Grafika有一些例子,例如硬件定标器练习器有一个三角形和一个正方形,可以在纹理和平面着色之间切换。它是用Java编写的,但是Java包装器非常薄,因此本机形式几乎相同。
    GLuint texture2;
    glGenTextures(1, &texture2);
    glBindTexture(GL_TEXTURE_2D, texture2);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, engine->state.im.imWidth, engine->state.im.imHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, engine->state.im.data);