Android OpenGL glTexImage2D未绘制
我正在尝试使用ndk在opengl纹理上显示图像。 我有一个图像结构: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
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);