一、初始化矩阵
//顶点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);