【Android OpenGL ES 开发 (五)】纹理相关(二)

纹理放大和缩小的过滤参数

1.使用线性插值效果最佳

2.通过修改

  float maxscale = 4.0f  //放大

  float  minscale = 0.5f //缩小

vertices[0].mPosition[0]=0.5f * maxscale; //x
vertices[0].mPosition[1]=0.5f * maxscale; //y

实现模糊效果

1.利用显卡的并行计算的强大功能对图像进行处理

2.FS中的代码实现

#ifdef GL_ES
prection mediump float;
#endif
uniform sampler2D U_Textture;
uniform vec4 U_ImageSize;
varying vec4 V_Texcoord;
void main(){
   vec3 color = vec3(0.0);
   float radius_in_pixle = 1.0;//半径
   //一个像素的偏移换算成纹理坐标在s,t方向偏移多少
   float radius_in_texcoord_s =  radius_in_pixle/U_ImageSize.x;
   float radius_in_texcoord_t =  radius_in_pixle/U_ImageSize.y;
   for(int y = -1; y<=1;y++){
     for(int x = -1; x<=1;x++){
         float texcoord_x= V_Texcoord.x + float(x) * radius_in_texcoord_s;
         float texcoord_y= V_Texcoord.y + float(y) * radius_in_texcoord_t;
         color += texture2D(U_Texture,vec2(texcoord_x,texcoord_y)).rgb;
    }
   }
   color/=9.0;
   gl_FragColor = vec4(color,texture2D(U_Texture,V_Texcoord.xy).a);
}

加载多张纹理

#include "Sence.h"
#include "Utils.h"
static AAssetManager *sAssetManager= nullptr;
GLuint vbo;//vertex buffer object
GLuint ibo;//index buffer object ,element array buffer object
GLuint program;
GLint modelMatrixLocation,viewMatrixLocation,projectionMatrixLocation,textlocation,text2location;
GLint attrPositionLocation,attrTexCoordLocation;
GLuint texture , texture2 , texture3;
glm::mat4 modelMatrix,viewMatrix,projectionMatrix,modelMatrix2;


unsigned char * LoadFileContent(const char *path,int&filesize){
    unsigned char *filecontent=nullptr;
    filesize=0;
    AAsset* asset = AAssetManager_open(sAssetManager,path,AASSET_MODE_UNKNOWN);
    if(asset!= nullptr){
        filesize=AAsset_getLength(asset);
        filecontent=new unsigned char[filesize+1];
        AAsset_read(asset,filecontent,filesize);
        filecontent[filesize] = 0;
        AAsset_close(asset);
    }
    return filecontent;
}
extern "C" JNIEXPORT void JNICALL Java_com_example_learnogles_MainActivity_Init(
        JNIEnv*env,
        jobject MainActivity,jobject am
){
    sAssetManager = AAssetManager_fromJava(env,am);
    __android_log_print(ANDROID_LOG_INFO,HANGYU_LOG_TAG,"Init");
    //设置擦除颜色
    glClearColor(0.6f,0.4f,0.1f,1.0f);
    Vertice vertices[4];//cpu -> gpu

    //图元左下角点
    vertices[0].mPosition[0]=-500.0f;//x
    vertices[0].mPosition[1]=-500.0f;//y
    vertices[0].mPosition[2]=0.0f;//z
    vertices[0].mPosition[3]=1.0f;//w
    vertices[0].mTexcoord[0]=0.0f;//u
    vertices[0].mTexcoord[1]=0.0f;//v
    vertices[0].mTexcoord[2]=0.0f;//
    vertices[0].mTexcoord[3]=0.0f;//

    //图元右下角点
    vertices[1].mPosition[0]=500.0f;//x
    vertices[1].mPosition[1]=-500.0f;//y
    vertices[1].mPosition[2]=0.0f;//z
    vertices[1].mPosition[3]=1.0f;//w
    vertices[1].mTexcoord[0]=1.0f;//u
    vertices[1].mTexcoord[1]=0.0f;//v
    vertices[1].mTexcoord[2]=0.0f;//
    vertices[1].mTexcoord[3]=0.0f;//

    //图元左上角点
    vertices[2].mPosition[0]=-500.0f;//x
    vertices[2].mPosition[1]=500.0f;//y
    vertices[2].mPosition[2]=0.0f;//z
    vertices[2].mPosition[3]=1.0f;//w
    vertices[2].mTexcoord[0]=0.0f;//u
    vertices[2].mTexcoord[1]=1.0f;//v
    vertices[2].mTexcoord[2]=0.0f;//
    vertices[2].mTexcoord[3]=0.0f;//

    //图元右上角点
    vertices[3].mPosition[0]=500.0f;//x
    vertices[3].mPosition[1]=500.0f;//y
    vertices[3].mPosition[2]=0.0f;//z
    vertices[3].mPosition[3]=1.0f;//w
    vertices[3].mTexcoord[0]=1.0f;//u
    vertices[3].mTexcoord[1]=1.0f;//v
    vertices[3].mTexcoord[2]=0.0f;//
    vertices[3].mTexcoord[3]=0.0f;//

    //沿X轴正方向平移x个单位(x是有符号数)
    modelMatrix = glm::translate(0.0f,0.0f,-1.0f);
    modelMatrix2 = glm::translate(50.0f,0.0f,-2.0f);

    unsigned short indexes[]={ 0,1,2,1,3,2};
    ibo = CreateBufferObject(GL_ELEMENT_ARRAY_BUFFER,indexes,sizeof(unsigned short)*6,GL_STATIC_DRAW);
    vbo = CreateBufferObject(GL_ARRAY_BUFFER,vertices,sizeof(Vertice) * 4,GL_STATIC_DRAW);

    program = CreateStandardProgram("test.vs","yuvtest.fs");
    attrPositionLocation = glGetAttribLocation(program,"position");
    attrTexCoordLocation = glGetAttribLocation(program,"texcoord");
    modelMatrixLocation = glGetUniformLocation(program,"U_ModelMatrix");
    viewMatrixLocation = glGetUniformLocation(program,"U_ViewMatrix");
    projectionMatrixLocation = glGetUniformLocation(program,"U_ProjectionMatrix");

    textlocation =  glGetUniformLocation(program,"U_Texture");
    text2location = glGetUniformLocation(program,"U_Texture2");;


    texture = CreateTextureFromFile("front.bmp");
    texture2 = CreateTextureFromFile("lenna.bmp");
    __android_log_print(ANDROID_LOG_INFO,HANGYU_LOG_TAG,"%d,%d,%d,%d",
                        attrPositionLocation,modelMatrixLocation,viewMatrixLocation,projectionMatrixLocation);
}
extern "C" JNIEXPORT void JNICALL Java_com_example_learnogles_MainActivity_OnViewportChanged(
        JNIEnv*env,
        jobject MainActivity,jint width,jint height
){
    __android_log_print(ANDROID_LOG_INFO,HANGYU_LOG_TAG,"OnViewportChanged %dx%d",width,height);
    glViewport(0,0,width,height);
    viewMatrix=glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),
                           glm::vec3(0.0,0.0,-1.0f),
                           glm::vec3(0.0,1.0f,0.0f));
    float half_width=float(width)/2.0f;
    float half_height=float(height)/2.0f;
    projectionMatrix=glm::ortho(-half_width,half_width,-half_height,half_height,0.1f,100.0f);
}
extern "C" JNIEXPORT void JNICALL Java_com_example_learnogles_MainActivity_Render(
        JNIEnv*env,
        jobject MainActivity
){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    //使用程序对象作为当前渲染状态的一部分
    glUseProgram(program);
    glEnable(GL_DEPTH_TEST);



    glActiveTexture(GL_TEXTURE0);//激活0号纹理单元(初始化为GL_TEXTURE0)
    glBindTexture(GL_TEXTURE_2D,texture);//绑定纹理
    glUniform1i(textlocation,0);//把0号纹理单元内容植入卡槽中


    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D,texture2);
    glUniform1i(text2location,1);



    //mvp矩阵
    glUniformMatrix4fv(modelMatrixLocation,1,GL_FALSE,glm::value_ptr(modelMatrix));
    glUniformMatrix4fv(viewMatrixLocation,1,GL_FALSE,glm::value_ptr(viewMatrix));
    glUniformMatrix4fv(projectionMatrixLocation,1,GL_FALSE,glm::value_ptr(projectionMatrix));
    //set attribute
    //启用或禁用通用顶点属性数组
    glEnableVertexAttribArray(attrPositionLocation);
    glVertexAttribPointer(attrPositionLocation,4,GL_FLOAT,GL_FALSE,sizeof(Vertice),0);
    glEnableVertexAttribArray(attrTexCoordLocation);
    glVertexAttribPointer(attrTexCoordLocation,4,GL_FLOAT,GL_FALSE,sizeof(Vertice),(void*)(sizeof(float)*4));

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo);
    glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_SHORT,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glUseProgram(0);
}

新建Fragment shader

#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D U_Texture;
uniform sampler2D U_Texture2;
varying vec4 V_Texcoord;
void main(){
    gl_FragColor = texture2D(U_Texture,V_Texcoord.xy) * texture2D(U_Texture2,V_Texcoord.xy);
}

渲染YUV420格式图片

#include "Sence.h"
#include "Utils.h"
static AAssetManager *sAssetManager= nullptr;
GLuint vbo;//vertex buffer object
GLuint ibo;//index buffer object ,element array buffer object
GLuint program;
GLint modelMatrixLocation,viewMatrixLocation,projectionMatrixLocation,textYlocation,textUlocation,textVlocation;
GLint attrPositionLocation,attrTexCoordLocation;
GLuint texture_y , texture_u , texture_v;
glm::mat4 modelMatrix,viewMatrix,projectionMatrix,modelMatrix2;


unsigned char * LoadFileContent(const char *path,int&filesize){
    unsigned char *filecontent = nullptr;
    filesize = 0;
    AAsset* asset = AAssetManager_open(sAssetManager,path,AASSET_MODE_UNKNOWN);
    if(asset!= nullptr){
        filesize = AAsset_getLength(asset);
        filecontent=new unsigned char[filesize+1];
        AAsset_read(asset,filecontent,filesize);
        filecontent[filesize] = 0;
        AAsset_close(asset);
    }
    return filecontent;
}

void InitYUV420()
{
    int filesize = 0;
    unsigned char * filecontent = LoadFileContent("test.yuv",filesize);
    unsigned char * YData = filecontent;
    int YDataSize = 1280 * 720;
    unsigned char * UData = filecontent + YDataSize;
    int UDataSize = 640 * 360;
    unsigned char * VData = filecontent + (YDataSize + UDataSize);
    delete [] filecontent;

    texture_y = CreateTexture2D(YData,1280,720,GL_ALPHA,GL_ALPHA);
    texture_u = CreateTexture2D(UData,640,360,GL_ALPHA,GL_ALPHA);
    texture_v = CreateTexture2D(VData,640,360,GL_ALPHA,GL_ALPHA);


}
extern "C" JNIEXPORT void JNICALL Java_com_example_learnogles_MainActivity_Init(
        JNIEnv*env,
        jobject MainActivity,jobject am
){
    sAssetManager = AAssetManager_fromJava(env,am);
    __android_log_print(ANDROID_LOG_INFO,HANGYU_LOG_TAG,"Init");
    //设置擦除颜色
    glClearColor(0.6f,0.4f,0.1f,1.0f);
    Vertice vertices[4];//cpu -> gpu

    //图元左下角点
    vertices[0].mPosition[0]=-500.0f;//x
    vertices[0].mPosition[1]=-500.0f;//y
    vertices[0].mPosition[2]=0.0f;//z
    vertices[0].mPosition[3]=1.0f;//w
    vertices[0].mTexcoord[0]=0.0f;//u
    vertices[0].mTexcoord[1]=0.0f;//v
    vertices[0].mTexcoord[2]=0.0f;//
    vertices[0].mTexcoord[3]=0.0f;//

    //图元右下角点
    vertices[1].mPosition[0]=500.0f;//x
    vertices[1].mPosition[1]=-500.0f;//y
    vertices[1].mPosition[2]=0.0f;//z
    vertices[1].mPosition[3]=1.0f;//w
    vertices[1].mTexcoord[0]=1.0f;//u
    vertices[1].mTexcoord[1]=0.0f;//v
    vertices[1].mTexcoord[2]=0.0f;//
    vertices[1].mTexcoord[3]=0.0f;//

    //图元左上角点
    vertices[2].mPosition[0]=-500.0f;//x
    vertices[2].mPosition[1]=500.0f;//y
    vertices[2].mPosition[2]=0.0f;//z
    vertices[2].mPosition[3]=1.0f;//w
    vertices[2].mTexcoord[0]=0.0f;//u
    vertices[2].mTexcoord[1]=1.0f;//v
    vertices[2].mTexcoord[2]=0.0f;//
    vertices[2].mTexcoord[3]=0.0f;//

    //图元右上角点
    vertices[3].mPosition[0]=500.0f;//x
    vertices[3].mPosition[1]=500.0f;//y
    vertices[3].mPosition[2]=0.0f;//z
    vertices[3].mPosition[3]=1.0f;//w
    vertices[3].mTexcoord[0]=1.0f;//u
    vertices[3].mTexcoord[1]=1.0f;//v
    vertices[3].mTexcoord[2]=0.0f;//
    vertices[3].mTexcoord[3]=0.0f;//

    //沿X轴正方向平移x个单位(x是有符号数)
    modelMatrix = glm::translate(0.0f,0.0f,-1.0f);
    modelMatrix2 = glm::translate(50.0f,0.0f,-2.0f);

    unsigned short indexes[]={ 0,1,2,1,3,2};
    ibo = CreateBufferObject(GL_ELEMENT_ARRAY_BUFFER,indexes,sizeof(unsigned short)*6,GL_STATIC_DRAW);
    vbo = CreateBufferObject(GL_ARRAY_BUFFER,vertices,sizeof(Vertice) * 4,GL_STATIC_DRAW);

    program = CreateStandardProgram("yuv420.vs","yuv420.fs");
    attrPositionLocation = glGetAttribLocation(program,"position");
    attrTexCoordLocation = glGetAttribLocation(program,"texcoord");
    modelMatrixLocation = glGetUniformLocation(program,"U_ModelMatrix");
    viewMatrixLocation = glGetUniformLocation(program,"U_ViewMatrix");
    projectionMatrixLocation = glGetUniformLocation(program,"U_ProjectionMatrix");

    textYlocation = glGetUniformLocation(program,"U_TextureY");
    textUlocation = glGetUniformLocation(program,"U_TextureU");
    textVlocation = glGetUniformLocation(program,"U_TextureV");

    InitYUV420();


    __android_log_print(ANDROID_LOG_INFO,HANGYU_LOG_TAG,"%d,%d,%d,%d",
                        attrPositionLocation,modelMatrixLocation,viewMatrixLocation,projectionMatrixLocation);
}
extern "C" JNIEXPORT void JNICALL Java_com_example_learnogles_MainActivity_OnViewportChanged(
        JNIEnv*env,
        jobject MainActivity,jint width,jint height
){
    __android_log_print(ANDROID_LOG_INFO,HANGYU_LOG_TAG,"OnViewportChanged %dx%d",width,height);
    glViewport(0,0,width,height);
    viewMatrix=glm::lookAt(glm::vec3(0.0f,0.0f,0.0f),
                           glm::vec3(0.0,0.0,-1.0f),
                           glm::vec3(0.0,1.0f,0.0f));
    float half_width=float(width)/2.0f;
    float half_height=float(height)/2.0f;
    projectionMatrix=glm::ortho(-half_width,half_width,-half_height,half_height,0.1f,100.0f);
}
extern "C" JNIEXPORT void JNICALL Java_com_example_learnogles_MainActivity_Render(
        JNIEnv*env,
        jobject MainActivity
){
    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    glBindBuffer(GL_ARRAY_BUFFER,vbo);
    //使用程序对象作为当前渲染状态的一部分
    glUseProgram(program);
    glEnable(GL_DEPTH_TEST);



    glActiveTexture(GL_TEXTURE0);//激活0号纹理单元(初始化为GL_TEXTURE0)
    glBindTexture(GL_TEXTURE_2D,texture_y);//绑定纹理
    glUniform1i(textYlocation,0);//把0号纹理单元内容植入卡槽中


    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D,texture_u);
    glUniform1i(textUlocation,1);


    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D,texture_v);
    glUniform1i(textVlocation,2);



    //mvp矩阵
    glUniformMatrix4fv(modelMatrixLocation,1,GL_FALSE,glm::value_ptr(modelMatrix));
    glUniformMatrix4fv(viewMatrixLocation,1,GL_FALSE,glm::value_ptr(viewMatrix));
    glUniformMatrix4fv(projectionMatrixLocation,1,GL_FALSE,glm::value_ptr(projectionMatrix));
    //set attribute
    //启用或禁用通用顶点属性数组
    glEnableVertexAttribArray(attrPositionLocation);
    glVertexAttribPointer(attrPositionLocation,4,GL_FLOAT,GL_FALSE,sizeof(Vertice),0);
    glEnableVertexAttribArray(attrTexCoordLocation);
    glVertexAttribPointer(attrTexCoordLocation,4,GL_FLOAT,GL_FALSE,sizeof(Vertice),(void*)(sizeof(float)*4));

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,ibo);
    glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_SHORT,0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);
    glBindBuffer(GL_ARRAY_BUFFER,0);
    glUseProgram(0);
}

VS 

attribute vec4 position;
attribute vec4 texcoord;
uniform mat4 U_ModelMatrix;
uniform mat4 U_ViewMatrix;
uniform mat4 U_ProjectionMatrix;
varying vec4 V_Texcoord;
void main(){
    V_Texcoord=texcoord;
    gl_Position=U_ProjectionMatrix*U_ViewMatrix*U_ModelMatrix*position;
}

FS

#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D U_TextureY;
uniform sampler2D U_TextureU;
uniform sampler2D U_TextureV;
varying vec4 V_Texcoord;
vec3 YUV420ToRGB(float y,float u,float v){
    return vec3(y+1.402*v,y-0.34413*u-0.71414*v,y+1.772*u);
}
vec3 YUV420ToRGBViaMatrix(float y,float u,float v){
    mat3 transform_matrix=mat3(
        1.0,1.0,1.0,
        0.0,-0.34413,1.772,
        1.402,-0.71414,0.0
    );
    return transform_matrix*vec3(y,u,v);
}
void main(){
    vec2 texcoord=vec2(V_Texcoord.x,1.0-V_Texcoord.y);
    float Y=texture2D(U_TextureY,texcoord).a;
    float U=texture2D(U_TextureU,texcoord).a-0.5;
    float V=texture2D(U_TextureV,texcoord).a-0.5;
    gl_FragColor=vec4(YUV420ToRGBViaMatrix(Y,U,V),1.0);
}

YUV纹理刷新

Utils类新增

void SubmitTexture2D(GLuint texture,void*pixel,int x, int y,int width,int height,GLenum cpu_format,GLenum dataType);
void SubmitTexture2D(GLuint texture,void*pixel,int x, int y,int width,int height,GLenum cpu_format,GLenum dataType)
{
    glBindTexture(GL_TEXTURE_2D,texture);
    glTexSubImage2D(GL_TEXTURE_2D,0,x,y,width,height,cpu_format,dataType,pixel);
    glBindTexture(GL_TEXTURE_2D,0);

}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

༄yi笑奈何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值