OpenGLES 2
翻转策略
方案一:图形顶点翻转180°,纹理保持原状
图形顶点利用旋转矩阵旋转180°,如图所示
【t 1】
shaderv.vsh完整源码如下
attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;
uniform mat4 scaleMatrix;
varying lowp vec2 varyTextCoord;
void main(){
varyTextCoord = textCoordinate;
vec4 vPos = position;
vPos = vPos * rotateMatrix * scaleMatrix;
gl_Position = vPos;
}
在zRotation矩阵数组后新增一个翻转矩阵,rotateTextureImage完整代码如下
- (void)rotateTextureImage{
//注意,想要获取shader里面的变量,这里记得要在glLinkProgram后面,后面,后面!
//1. rotate等于shaderv.vsh中的uniform属性,rotateMatrix
GLuint rotate = glGetUniformLocation(self.myPrograme, "rotateMatrix");
GLuint scale = glGetUniformLocation(self.myPrograme, "scaleMatrix");
//2.获取渲旋转的弧度
float radius = 180 * 3.14159f / 180.0f;
//3.求得弧度对于的sin\cos值
float s = sin(radius);
float c = cos(radius);
//4.因为在3D课程中用的是横向量,在OpenGL ES用的是列向量
/*
参考Z轴旋转矩阵
*/
GLfloat zRotation[16] = {
c, -s, 0, 0,
s, c, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
};
GLfloat scaleMartix[16] = {
-1, 0, 0, 0,
0, 1, 0, 0,
0, 0, 1, 0,
0, 0, 0, 1,
};
//5.设置旋转矩阵
/*
glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
location : 对于shader 中的ID
count : 个数
transpose : 转置
value : 指针
*/
glUniformMatrix4fv(rotate, 1, GL_FALSE, zRotation);
glUniformMatrix4fv(scale, 1, GL_FALSE, scaleMartix);
}
方案二:解压图片时,将图片源文件翻转
在加载纹理setupTexture函数的第六步 使用默认方法绘制后,及context绘制的图片进行翻转,主要代码如下
//围绕x、y平移
CGContextTranslateCTM(spriteContext, rect.origin.x, rect.origin.y);
//围绕y平移
CGContextTranslateCTM(spriteContext, 0, rect.size.height);
//x⽅向不变 y⽅向沿着画布⾃己的 坐标系对应的y轴渲染
CGContextScaleCTM(spriteContext, 1.0, -1.0);//翻转
//相对于画布,在自己的坐标系上画图
CGContextTranslateCTM(spriteContext, -rect.origin.x, -rect.origin.y);
CGContextDrawImage(spriteContext, rect, spriteImage);
针对上面的这部分代码,其实可以简化成
CGContextTranslateCTM(spriteContext, 0, rect.size.height);
//x⽅向不变 y⽅向沿着画布⾃己的 坐标系对应的y轴渲染
CGContextScaleCTM(spriteContext, 1.0, -1.0);//翻转
CGContextDrawImage(spriteContext, rect, spriteImage);
方案三:修改片元着色器,纹理坐标围绕y轴翻转
将shaderf.fsh中的
gl_FragColor = texture2D(colorMap, varyTextCoord);
改为
gl_FragColor = texture2D(colorMap, vec2(varyTextCoord.x,1.0-varyTextCoord.y));
// 将纹理坐标围绕y轴翻转
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
//gl_FragColor = texture2D(colorMap, varyTextCoord);
gl_FragColor = texture2D(colorMap, vec2(varyTextCoord.x,1.0-varyTextCoord.y));
}
方案四:修改顶点着色器,纹理坐标围绕y轴翻转
在shaderv.vsh中
varyTextCoord = textCoordinate;
改为
varyTextCoord = vec2(textCoordinate.x,1.0-textCoordinate.y);
// 其实方案四与方案三是一个原理,只是在不同的着色器中修改纹理坐标
attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;
void main()
{
//varyTextCoord = textCoordinate;
varyTextCoord = vec2(textCoordinate.x,1.0-textCoordinate.y);
gl_Position = position;
}
方案五:直接修改顶点数组中的纹理坐标
原理同3、4一致,只是直接在顶点数组中修改源数据
GLfloat attrArr[] =
{
0.5f, -0.5f, -1.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -1.0f, 0.0f, 1.0f,
-0.5f, -0.5f, -1.0f, 0.0f, 0.0f,
0.5f, 0.5f, -1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -1.0f, 0.0f, 1.0f,
0.5f, -0.5f, -1.0f, 1.0f, 0.0f,
};
修改后 主要看纹理坐标的Y轴
GLfloat attrArr[] =
{
0.5f, -0.5f, -1.0f, 1.0f, 1.0f,
-0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
-0.5f, -0.5f, -1.0f, 0.0f, 1.0f,
0.5f, 0.5f, -1.0f, 1.0f, 0.0f,
-0.5f, 0.5f, -1.0f, 0.0f, 0.0f,
0.5f, -0.5f, -1.0f, 1.0f, 1.0f,
};
方案六:直接翻转顶点着色器中的顶点
在翻转顶点时,就不是直接对Y值用1去减,因为顶点的取值范围是[-1 1] ,所以我们直接加上负号做翻转即可
attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;
void main(){
varyTextCoord = textCoordinate;
gl_Position = vec4(position.x, -position.y, position.z, 1);
}
总结 :只有高效的算法才叫数学
网友评论