关闭

openGL ES JNI贴图 平移 旋转 缩放

标签: jni缩放OpenGL-ES2旋转-平移-NDK
1467人阅读 评论(0) 收藏 举报
分类:

采用demo为NDK sample下的hello-gl2。
1、修改gVertexShader

static const char gVertexShader[] =
    "uniform mat4 uMVPMatrix;   \n"  //变换矩阵
    "attribute vec2 a_position;   \n"
          "attribute vec2 a_texCoord;   \n"
          "varying vec2 v_texCoord;     \n"
          "void main()                  \n"
          "{                            \n"
          "   gl_Position uMVPMatrix*vec4(a_position,0,1); \n"
          "   v_texCoord = a_texCoord;  \n"
          "}                            \n";

修改gFragmentShader

static const char gFragmentShader[] = 
    "precision mediump float;                            \n"
          "varying vec2 v_texCoord;                            \n"
          "uniform sampler2D s_texture;                        \n"
          "void main()                                         \n"
          "{                                                   \n"
          "  gl_FragColor = texture2D( s_texture, v_texCoord );\n"
          "}                                                   \n";

在函数setupGraphics里添加纹理信息

bool setupGraphics(int w, int h) {
    printGLString("Version", GL_VERSION);
    printGLString("Vendor", GL_VENDOR);
    printGLString("Renderer", GL_RENDERER);
    printGLString("Extensions", GL_EXTENSIONS);
    LOGI("setupGraphics(%d, %d)", w, h);
    gProgram = createProgram(gVertexShader, gFragmentShader);
    if (!gProgram) {
        LOGE("Could not create program.");
        return false;
    }
    glViewport(0, 0, w, h);
    checkGlError("glViewport");

    gvPositionHandle = glGetAttribLocation(gProgram,"a_position");
    gvTexCoordHandle =  glGetAttribLocation(gProgram,"a_texCoord");
    gvSTexCoordHandle =  glGetUniformLocation(gProgram,"s_texture");
    muMVPMatrixHandle =  glGetUniformLocation(gProgram, "uMVPMatrix");

    glPixelStorei ( GL_UNPACK_ALIGNMENT, 1 );
    glGenTextures ( 1, &textureId );
    glBindTexture ( GL_TEXTURE_2D, textureId );
    glTexImage2D ( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, dataFromBmp );
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,  GL_LINEAR );
    return true;
}

4、设置renderFrame

void renderFrame() {
    static float grey;
    grey = 0.1f;
    if (grey > 1.0f) {
        grey = 0.0f;
    }
    glClearColor(grey, grey, grey, 1.0f);
    checkGlError("glClearColor");
    glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
    checkGlError("glClear");
    glUseProgram(gProgram);
    checkGlError("glUseProgram");
    glVertexAttribPointer(gvPositionHandle,2, GL_FLOAT, GL_FALSE, 0,gTriangleVertices );
    glVertexAttribPointer(gvTexCoordHandle,2, GL_FLOAT, GL_FALSE, 0, gTexCoords);
    glUniformMatrix4fv(muMVPMatrixHandle, 1, GL_FALSE, mat4);
    glEnableVertexAttribArray(gvPositionHandle);
    glEnableVertexAttribArray(gvTexCoordHandle);
    glActiveTexture ( GL_TEXTURE0 );
    glBindTexture ( GL_TEXTURE_2D, textureId );
    glUniform1i ( gvSTexCoordHandle, 0 );
   // glUniform1i(muMVPMatrixHandle,0);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

5、在GL2JNILib.java里声明NATIVE函数

public class GL2JNILib {

     static {
         System.loadLibrary("gl2jni");
     }

    /**
     * @param width the current view width
     * @param height the current view height
     */
     public static native void init(int width, int height);
     public static native void step();
     public native static void  processBitmap(Bitmap bitmap);
     public native static void rotate(float mat[]);
}

6、添加相关控件
7添加事件
在GL2JNIActivity里声明如下变量

    GL2JNIView mView;
    static float[] mMMatrix = new float[16];
    static float[] moveMatrix = new float[16];//随便写的,就临时数组。
    static float xAngle =0;//角度

这儿不能直接调用JNI,需要用GL线程来运行。故
需要调用

mView.queueEvent(new Runnable() {
            @Override
            public void run() {
                GL2JNILib.rotate(mMMatrix);//JNI接口,最终的变换矩阵
            }
        });
   public void moveRight(View v )
    {
        Matrix.setIdentityM(moveMatrix, 0);
        Matrix.translateM(moveMatrix, 0, 0.1f, 0, 0);
        Matrix.multiplyMM(mMMatrix,0,moveMatrix,0,mMMatrix,0);

        button1.setText("向右");
        mView.queueEvent(new Runnable() {
            @Override
            public void run() {
                GL2JNILib.rotate(mMMatrix);
            }
        });
    }  
    public void moveLeft(View v )
    {
        Matrix.setIdentityM(moveMatrix, 0);
        Matrix.translateM(moveMatrix, 0, -0.1f, 0, 0);
        Matrix.multiplyMM(mMMatrix,0,moveMatrix,0,mMMatrix,0);
        button4.setText("向左");
        mView.queueEvent(new Runnable() {
            @Override
            public void run() {
                GL2JNILib.rotate(mMMatrix);
            }
        });
    } 
    public void zoomOut(View v )
    {
        Matrix.setIdentityM(moveMatrix, 0);
        Matrix.scaleM(moveMatrix,0,1.1f,1.1f,1.1f);
        Matrix.multiplyMM(mMMatrix,0,moveMatrix,0,mMMatrix,0);
        mView.queueEvent(new Runnable() {
            @Override
            public void run() {
                GL2JNILib.rotate(mMMatrix);
            }
        });


        button2.setText("放大");

    }  
    public void zoomIn(View v )
    {
        Matrix.setIdentityM(moveMatrix, 0);
        Matrix.scaleM(moveMatrix, 0, 0.9f, 0.9f, 0.9f);
        Matrix.multiplyMM(mMMatrix,0,moveMatrix,0,mMMatrix,0);
        mView.queueEvent(new Runnable() {
            @Override
            public void run() {
                GL2JNILib.rotate(mMMatrix);
            }
        });
    }

大体如此了。

补充:
需要 填充图片时,我没在JNI上找到现成.cpp 和.h文件来处理图片。所以 采用的是jni传入bitmap的方式。

 void  Java_com_android_gl2jni_GL2JNILib_processBitmap(JNIEnv *env, jclass obj, jobject bmpObj)
{
    //return ;
    LOGE("-----------------------");
    int ret;
    AndroidBitmapInfo bmpInfo={0};
    if(ret = AndroidBitmap_getInfo(env,bmpObj,&bmpInfo)<0)
    {
        LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
        return ;
    }
    width = bmpInfo.width;
    height = bmpInfo.height;

    if(ret = AndroidBitmap_lockPixels(env,bmpObj,(void**)&dataFromBmp))
    {
        LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
        return;
    }
    AndroidBitmap_unlockPixels(env, bmpObj);
    return ;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android OpenGLES2.0(十)——OpenGL中的平移、旋转、缩放

在前面的博客中,所有的例子都是一个对象,类似绘制圆锥绘制圆柱,我们都是传入一个参数,然后去控制那个圆面的位置,如果我们要绘制几个个正方形,它的位置、大小、方向都是不相同的,按照那种方式该多麻烦啊。所以...
  • junzia
  • junzia
  • 2016-11-14 01:27
  • 4453

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 ...
  • itianyi
  • itianyi
  • 2016-05-25 15:44
  • 1755

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 ...
  • itianyi
  • itianyi
  • 2016-05-25 15:44
  • 1755

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议...
  • s_s520
  • s_s520
  • 2013-12-24 11:11
  • 946

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放 罗朝辉 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商业用途-保持一致”创作公用协议 ...
  • whl_cxy
  • whl_cxy
  • 2014-07-23 18:05
  • 864

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放

[OpenGL ES 04]3D变换实践篇:平移,旋转,缩放 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循“署名-非商业用途-保持一致”创作公用协议 前言...
  • vampirem
  • vampirem
  • 2013-09-22 17:49
  • 1000

OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图

  • 2016-05-23 14:44
  • 8.98MB
  • 下载

OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器_光照作用_棋盘纹理贴图

读取bmp等图片格式中的像素还 代码打错一个就一直First-chance exception ,貌似还有一个要用q或者Q才能成功退出,不知道缺少哪句,我用窗口红叉退出也会First-chance e...
  • u014646950
  • u014646950
  • 2016-05-23 14:20
  • 646

android opengl es 控制 贴图旋转

android opengl es 控制 贴图旋转 摘要:控制贴图旋转有很多种方式,通过片段着色语言或者顶点着色语言可以达到控制贴图旋转的目的,本文讲述一种更简单的控制方式,通过控制顶多坐标控制贴图...
  • c553110519
  • c553110519
  • 2017-06-06 21:01
  • 439

shader学习基础之十一实现纹理的缩放平移和旋转,以及用c#代码合并两种贴图并且控制位置

首先,我们先实现用代码在shader里面实现缩放,平移和旋转! 上代码,首先是我们的shader: Shader "Unlit/贴图的平移缩放" { Properties { _MainTex("Te...
  • xiongwen_li
  • xiongwen_li
  • 2017-04-05 17:15
  • 1607
    个人资料
    • 访问:70189次
    • 积分:916
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:95篇
    • 译文:0篇
    • 评论:9条
    最新评论