Android Opengl 学习笔记04——矩阵操作

一、初始化矩阵

//顶点Shader
const char *vertex = "attribute vec4 v_Position;\n"
                     "attribute vec2 f_Position;\n"
                     "varying vec2 ft_Position;\n"

                     "uniform mat4 u_Matrix;\n"  //shader中声明矩阵


                     "void main() {\n"
                     "    ft_Position = f_Position;\n"
                     "   gl_Position = v_Position * u_Matrix;\n"
                     "}";

//纹理Shader
const char *fragment = "precision mediump float;\n"
                       "varying vec2 ft_Position;\n"
                       "uniform sampler2D sTexture;\n"
                       "void main() {\n"
                       "    gl_FragColor=texture2D(sTexture, ft_Position);\n"
                       "}";

int program;
GLint vPosition;
GLint fPosition;
GLint sampler;
GLuint textureId;

GLint u_matrix;//声明矩阵

//java层传递过来的图片信息
int w;
int h;
void *pixels = NULL;

//顶点坐标
float vertexs[] = {
        1,-1,
        1,1,
        -1,-1,
        -1,1
};
//与之对应的纹理坐标
float fragments[] ={
        1,1,
        1,0,
        0,1,
        0,0
};

//声明一个4*4数组
float matrix[16];

//初始化矩阵
static void initMatrix(float *matrix)
{
    for(int i = 0; i < 16; i++)
    {
        if(i % 5 == 0)
        {
            matrix[i] = 1;
        } else{
            matrix[i] = 0;
        }
    }
}


//实现EGL线程回调函数的实现
void callback_SurfaceCrete(void *ctx)
{

    LOGD("callback_SurfaceCrete");
    SamEglThread *samEglThread = static_cast<SamEglThread *>(ctx);

    program = createProgrm(vertex, fragment);//创建一个渲染程序
    LOGD("opengl program is %d", program);
    vPosition = glGetAttribLocation(program, "v_Position");//顶点坐标
    fPosition = glGetAttribLocation(program, "f_Position");//纹理坐标
    sampler = glGetUniformLocation(program, "sTexture");//2D纹理

    u_matrix = glGetUniformLocation(program, "u_Matrix");//矩阵

    //打印输出初始化前的矩阵
    for(int i = 0; i < 16; i++)
    {
        LOGE("%f", matrix[i]);
    }
    LOGD("======");

    //初始化矩阵
    initMatrix(matrix);

    //打印输出初始化后的矩阵
    for(int i = 0; i < 16; i++)
    {
        LOGE("%f", matrix[i]);
    }


    glGenTextures(1, &textureId);//创建纹理
    glBindTexture(GL_TEXTURE_2D, textureId);//绑定纹理

    //设置环绕(超出纹理坐标范围)方式(s==x t==y GL_REPEAT 重复)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

    //设置过滤(纹理像素映射到坐标点)方式(缩小、放大:GL_LINEAR线性)
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR);

    //设置图片
    if(pixels != NULL)
    {
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
    }
    glBindTexture(GL_TEXTURE_2D, 0);//解绑纹理


}

void callback_SurfacChange(int w, int h, void *ctx)
{

    LOGD("callback_SurfacChange");
    SamEglThread *samEglThread = static_cast<SamEglThread *>(ctx);
    glViewport(0, 0, w, h);

}

void callback_SurfaceDraw(void *ctx)
{
    LOGD("callback_SurfaceDraw");
    SamEglThread *samEglThread = static_cast<SamEglThread *>(ctx);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(program);

    //设置渲染程序使用的矩阵
    glUniformMatrix4fv(u_matrix, 1, GL_FALSE, matrix);

    //使用sampler
    glActiveTexture(GL_TEXTURE5);
    glUniform1i(sampler, 5);

    //绑定纹理
    glBindTexture(GL_TEXTURE_2D, textureId);

    //激活并绑定顶点坐标
    glEnableVertexAttribArray(vPosition);
    glVertexAttribPointer(vPosition, 2, GL_FLOAT, false, 8, vertexs);

    //激活并绑定纹理坐标
    glEnableVertexAttribArray(fPosition);
    glVertexAttribPointer(fPosition, 2, GL_FLOAT, false, 8, fragments);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);//绘制纹理

    glBindTexture(GL_TEXTURE_2D, 0);//解绑纹理
}

二、旋转矩阵

1、按Z轴旋转:

static void rotateMatrix(double angle, float *matrix)
{
    angle = angle * (M_PI / 180.0);

    matrix[0] = cos(angle);
    matrix[1] = -sin(angle);
    matrix[4] = sin(angle);
    matrix[5] = cos(angle);

}

2、初始化矩阵坐标之后进行Z轴旋转:

//初始化矩阵4*4
    initMatrix(matrix);
 //旋转矩阵
    rotateMatrix(90, matrix);

三、缩放矩阵

1、沿x轴y轴缩放:

static void scaleMatrix(double scale, float *matrix)
{
    matrix[0] = scale;
    matrix[5] = scale;
}

2、初始化矩阵后进行缩放:

 //初始化矩阵
    initMatrix(matrix);
//缩放矩阵
    scaleMatrix(0.5,matrix);
QKB
发布了5 篇原创文章 · 获赞 4 · 访问量 2153

猜你喜欢

转载自blog.csdn.net/caphpca/article/details/104079639