1:AAssetManager 从安卓assets目录下读取文件
2:std_image 加载图片 详情可查看道友博客std_image使用
3:glm 图片变换操作 (这里只做简单的平移和缩放操作)
4:opengl 纹理展示
由于很简单我们直接上代码了:
原生页面代码
OpenGLSurfaceView:展示绘制的结果
public class OpenGLSurfaceView extends GLSurfaceView {
public OpenGLSurfaceView(Context context) {
super(context);
}
public OpenGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
setRenderer(new OpenGLSurfaceRender(context));
}
}
OpenGLSurfaceRender:绘制操作+初始化OpenGL
public class OpenGLSurfaceRender implements GLSurfaceView.Renderer {
private Context context;
public OpenGLSurfaceRender(Context context){
this.context = context;
}
@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
readResource(context.getAssets(), "rabit.png");
openGLInit();
}
@Override
public void onSurfaceChanged(GL10 gl10, int i, int i1) {
openResize(i, i1);
}
@Override
public void onDrawFrame(GL10 gl10) {
openOnDraw();
}
public native void openGLInit();
public native void openResize(int width,int height);
public native void openOnDraw();
public native int readResource(AssetManager manager, String fileName);
}
cmake配置
cmake_minimum_required(VERSION 3.18.1)
project("openg")
include_directories(3rdparty/libglm/include)
include_directories(3rdparty/libstbImage/include)
add_library(
openg
SHARED
ImageTexture.cpp
opengl.cpp
native-lib.cpp)
find_library(
log-lib
log)
target_link_libraries(
openg
-lGLESv1_CM
-lGLESv2
android
${log-lib})
主要的c++内容我们换了个cpp文件 opengl.cpp
opengl.cpp: opengl绘制纹理
#include#include #include #include #include #include "CCImage.h" #include #include #include #include #include #include #include #include #include #include "CCGLPrimitivesDef.h" #include #define TAG "TEST_OPENGL" #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__) GLuint m_texID; GLuint m_texID2; // // Created by Henry on 2022/7/7. // GLuint createOpenGLTexture(CCImage* pImg) { if(pImg == NULL){ return -1; } GLuint textureID; glEnable(GL_TEXTURE_2D); glGenTextures(1,&textureID);//产生纹理索引 glBindTexture(GL_TEXTURE_2D,textureID);//绑定纹理索引,之后的操作都针对当前纹理索引 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//指当纹理图象被使用到一个大于它的形状上时 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//指当纹理图象被使用到一个小于或等于它的形状上时 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,pImg->GetWidth(),pImg->GetHeight(),0,GL_RGBA,GL_UNSIGNED_BYTE,pImg->GetData());//指定参数,生成纹理 return textureID; } extern "C" JNIEXPORT void JNICALL Java_com_henry_openg_OpenGLSurfaceRender_openGLInit(JNIEnv *env, jobject obj) { glClearColor(0.0,0.0,0.0,1.0); glClearDepthf(1.0); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); } extern "C" JNIEXPORT void JNICALL Java_com_henry_openg_OpenGLSurfaceRender_openResize(JNIEnv *env, jobject thiz, jint width, jint height) { glViewport(0,0,width,height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrthof(-1,1,-1,1,0.1,1000.0); } extern "C" JNIEXPORT void JNICALL Java_com_henry_openg_OpenGLSurfaceRender_openOnDraw(JNIEnv *env, jobject thiz) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //glCullFace(GL_BACK); CCFloat5 planVertices[] = { { -1.0f, -1.0f, 1.0f, 0, 0 }, { -1.0f,1.0f, 1.0f, 0, 1 }, { 1.0f,-1.0f, 1.0f, 1, 0 }, { 1.0f, 1.0f, 1.0f, 1, 1 }, }; glBindTexture(GL_TEXTURE_2D,m_texID); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(3,GL_FLOAT,sizeof(CCFloat5),planVertices); glTexCoordPointer(2,GL_FLOAT,sizeof(CCFloat5),&planVertices[0].u); // m_angle += 0.05f; glm::mat4x4 cubeMat; glm::mat4x4 cubeScaleMat = glm::scale(glm::mat4(1.0f),glm::vec3(1.0f, 0.7f, 0.5) ); // cubeMat = cubeTransMat * cubeRotMat * cubeScaleMat; cubeMat = cubeScaleMat; glLoadMatrixf(glm::value_ptr(cubeMat)); glDrawArrays(GL_TRIANGLE_STRIP,0,4); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); CCFloat5 planVertices2[] = { { -1.0f, -1.0f, 1.0f, 0, 0 }, { -1.0f,1.0f, 1.0f, 0, 1 }, { 1.0f,-1.0f, 1.0f, 1, 0 }, { 1.0f, 1.0f, 1.0f, 1, 1 }, }; glBindTexture(GL_TEXTURE_2D,m_texID2); glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); glVertexPointer(3,GL_FLOAT,sizeof(CCFloat5),planVertices2); glTexCoordPointer(2,GL_FLOAT,sizeof(CCFloat5),&planVertices2[0].u); // m_angle += 0.05f; glm::mat4x4 cubeTransMat1 = glm::translate(glm::mat4(1.0f), glm::vec3(0.3f, 0.4f, -0.5)); // glm::mat4x4 cubeRotMat1 = glm::rotate(glm::mat4(1.0f),0.8f,glm::vec3(0.0f, 0.0f, 0.0f) ); glm::mat4x4 cubeScaleMat1 = glm::scale(glm::mat4(1.0f),glm::vec3(1.0f, 0.4f, 0.5) ); // cubeMat = cubeTransMat1 * cubeRotMat1 * cubeScaleMat1; cubeMat = cubeTransMat1 *cubeScaleMat1; glLoadMatrixf(glm::value_ptr(cubeMat)); glDrawArrays(GL_TRIANGLE_STRIP,0,4); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } extern "C" JNIEXPORT jint JNICALL Java_com_henry_openg_OpenGLSurfaceRender_readResource(JNIEnv *env, jobject thiz, jobject assetManager, jstring fName) { AAssetManager *mAssetManager = AAssetManager_fromJava (env, assetManager); if (NULL == mAssetManager){ LOGE("assetManager is NULL"); return -1; } const char *fileName = env->GetStringUTFChars(fName, 0); if (NULL == fileName){ LOGE("fileName is NULL"); return -1; } LOGE ("FileName is %s", fileName); AAsset *asset = AAssetManager_open (mAssetManager, fileName, AASSET_MODE_UNKNOWN); if (NULL == asset){ LOGE("asset is NULL"); return -1; } off_t bufferSize = AAsset_getLength(asset); LOGE("buffer size is %ld", bufferSize); unsigned char *imgBuff = (unsigned char *)malloc(bufferSize + 1); if (NULL == imgBuff){ LOGE("imgBuff alloc failed"); return -1; } memset(imgBuff, 0, bufferSize + 1); int readLen = AAsset_read(asset, imgBuff, bufferSize); LOGE("Picture read: %d", readLen); CCImage* glImage = CCImage::ReadFromBuffer(imgBuff,readLen); m_texID = createOpenGLTexture(glImage); m_texID2 = createOpenGLTexture(glImage); delete glImage; if (imgBuff){ free(imgBuff); imgBuff = NULL; } AAsset_close(asset); env->ReleaseStringUTFChars(fName, fileName); return 0; }
CCGLPrimitivesDef.h 定义的一些结构体
//
// Created by Henry on 2022/7/6.
//
#ifndef OPENGLTEST_CCGLPRIMITIVESDEF_H
#define OPENGLTEST_CCGLPRIMITIVESDEF_H
#endif //OPENGLTEST_CCGLPRIMITIVESDEF_H
struct CCFloat7{
float x;
float y;
float z;
float r;
float g;
float b;
float a;
};
float m_angle=0.0f;
struct CCFloat3{
float x;
float y;
float z;
};
struct CCFloat5{
float x;
float y;
float z;
float u;
float v;
};
CCImage.h: std_iamge加载封装
#ifndef CCIMAGE_H #define CCIMAGE_H #define STB_IMAGE_IMPLEMENTATION #include#include extern "C"{ #include "stb_image.h" } #ifndef U8_t #define U8_t unsigned char #endif class CCImage { public: CCImage(int w, int h,int type, U8_t* imgData){ m_width =w; m_height =h; m_type = type; int imgSize = m_width * m_height * 4; if(imgSize >0 && imgData != nullptr){ m_pImgData =(U8_t*) malloc(imgSize); memcpy(m_pImgData,imgData,imgSize); }else{ m_pImgData = NULL; } } ~CCImage() { if(m_pImgData) { free(m_pImgData); } } static CCImage* ReadFromFile(const char* fileName){ int type = 0; int width = 0; int height = 0; //stbi_set_flip_vertically_on_load(true); U8_t* picData = stbi_load(fileName, &width, &height, &type, STBI_rgb_alpha); CCImage* image = new CCImage(width, height, type, (U8_t*)picData); stbi_image_free(picData); return image; } static CCImage* ReadFromBuffer(unsigned char * dataBuff,int length){ int type = 0; int width = 0; int height = 0; stbi_set_flip_vertically_on_load(true); U8_t* picData = stbi_load_from_memory(dataBuff, length, &width, &height, &type, 0); CCImage* image = new CCImage(width, height, type, (U8_t*)picData); stbi_image_free(picData); return image; } int GetWidth() const {return m_width; } int GetHeight() const { return m_height; } int GetType() const {return m_type; } U8_t* GetData() const { return m_pImgData; } private: int m_width =0; int m_height =0; int m_type =0; U8_t* m_pImgData =NULL; }; #endif // CCIMAGE_H
glm和std_image的库可以自己下载下:
glm库下载
std_image库下载



