bak 9.NDK 下面 編譯 libpng.已經如何在opengl es 裏面讀取png圖片.

手上有好些,前一階段的工作成果.一直沒有時間整理出來.
先把cola2d 裏面使用的一些基礎整理下.

在ndk 下如何讀取png到opengl es 的texture了?
其實做法和linux下面沒什麼區別,我們首先要用到libpng這個開源的庫.
從 http://www.libpng.org/pub/png/libpng.html 下載到 libpng-1.2.41這個版本.

然後在android ndk 新建一個libpng的project .
我的android.mk 文件如下.

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := png
LOCAL_CFLAGS := -I$(LOCAL_PATH)  /
	-DPNG_USE_GLOBAL_ARRAYS	/
	-DPNG_READ_SUPPORTED

LOCAL_CPP_EXTENSION := .cpp

# Note this simple makefile var substitution, you can find even simpler examples in different Android projects
LOCAL_SRC_FILES :=  $(notdir $(wildcard $(LOCAL_PATH)/*.c))
include $(BUILD_STATIC_LIBRARY)

這樣就可以編譯好libpng.a

需要注意的是 如果使用該庫,鏈接時,需要加上-lz 這兒需要帶上zlib庫 這個庫,android ndk 已經自帶了.不需要自行編譯.

opengl es 如何使用該庫讀取一個png圖片了?
讀取png 代碼:

unsigned char* Texture::ReadPNG (const char* file, png_uint_32* w, png_uint_32* h)
{
	FILE* f;
	unsigned char sig[8];
	png_structp png_ptr;
	png_infop   info_ptr;
	unsigned char* image_data;
	int bit_depth;
	int color_type;
	unsigned int rowbytes;
	png_uint_32 i;
	png_bytepp row_pointers;

	if ((f = fopen(file, "rb")) == NULL)
		return NULL;
	fread(sig, sizeof(*sig), sizeof(sig), f);
	if (!png_check_sig(sig, sizeof(*sig))) {
		fclose(f);
		return NULL;
	}
	if ((png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL)) == NULL) {
		fclose(f);
		return NULL;
	}
	if ((info_ptr = png_create_info_struct(png_ptr)) == NULL) {
		png_destroy_read_struct(&png_ptr, NULL, NULL);
		fclose(f);
		return NULL;
	}

	if (setjmp(png_jmpbuf(png_ptr))) {
		png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
		fclose(f);
		return NULL;
	}
	png_ptr->io_ptr = (png_voidp) f;
	png_set_sig_bytes(png_ptr, 8);

	png_read_info(png_ptr, info_ptr);
	png_get_IHDR(png_ptr, info_ptr, w, h, &bit_depth, &color_type, NULL, NULL, NULL);
	if (color_type & PNG_COLOR_MASK_ALPHA)
		png_set_strip_alpha(png_ptr);
	if (bit_depth > 
		png_set_strip_16(png_ptr);
	if (color_type == PNG_COLOR_TYPE_GRAY || color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
		png_set_gray_to_rgb(png_ptr);
	if (color_type == PNG_COLOR_TYPE_PALETTE)
		png_set_palette_to_rgb(png_ptr);
	png_read_update_info(png_ptr, info_ptr);

	rowbytes = png_get_rowbytes(png_ptr, info_ptr);
	if ((image_data =(unsigned char *) malloc(*h * rowbytes)) == NULL) {
		png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
		fclose(f);
		return NULL;
	}
	if ((row_pointers =(png_bytepp) malloc(*h * sizeof(png_bytep))) == NULL) {
		png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
		fclose(f);
		free(image_data);
		return NULL;
	}

	for (i = 0; i < *h; i++)
		row_pointers[*h - 1 - i] = image_data + i*rowbytes;
	png_read_image(png_ptr, row_pointers);
	free(row_pointers);
	png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
	fclose(f);

	return image_data;
}

然後使用
下面方法即可讀入到texture裏面

m_width=imgw;
  	m_height=imgh;
	  glGenTextures(1, &m_id);
		glBindTexture(GL_TEXTURE_2D, m_id);
		glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, imgw, imgh, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
		GLint crop[4] = { 0, 0, m_width, m_height };
    glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop);
    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    //glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );

這部分內容和普通opengl es 的開發都沒有區別.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章