iOS開發(fā)之OpenGL ES(三) —— 圖片紋理翻轉(zhuǎn)策略

前言

在上一個iOS開發(fā)之OpenGL ES(二) —— 快速了解并使用GLKit案例中艺栈,使用了如下代碼來做翻轉(zhuǎn),如果我們不做翻轉(zhuǎn),加載出來的圖片會是倒置的糙箍。

 //紋理坐標原點是左下角,但是圖片顯示原點應(yīng)該是左上角.
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:@(1), GLKTextureLoaderOriginBottomLeft,nil];
    GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfFile:filePath options:options error:nil];

要翻轉(zhuǎn)的原因和上面的注釋所寫的差不多寸士,簡單理解一下檐什,是因為OpenGL要求y軸0.0坐標是在圖片的底部的,但是圖片的y軸0.0坐標通常在頂部弱卡。

1. 翻轉(zhuǎn)原始紋理坐標

原始頂點數(shù)組中的坐標如下:

  //前3個是頂點坐標乃正,后2個是紋理坐標
    GLfloat attrArr[] =
    {
        0.5f, -0.5f, 0.0f,     1.0f, 0.0f,
        -0.5f, 0.5f, 0.0f,     0.0f, 1.0f,
        -0.5f, -0.5f, 0.0f,    0.0f, 0.0f,
        
        0.5f, 0.5f, 0.0f,      1.0f, 1.0f,
        -0.5f, 0.5f, 0.0f,     0.0f, 1.0f,
        0.5f, -0.5f, 0.0f,     1.0f, 0.0f,
    };

由于紋理坐標是0-1的,所以我們只需要用 1 減 原來的紋理坐標的y值婶博,即可完成翻轉(zhuǎn)瓮具,如下:

  //前3個是頂點坐標,后2個是紋理坐標
    GLfloat attrArr[] =
    {
        0.5f, -0.5f, -1.0f,     1.0f, 1 - 0.0f,
        -0.5f, 0.5f, -1.0f,     0.0f, 1 - 1.0f,
        -0.5f, -0.5f, -1.0f,    0.0f, 1 - 0.0f,
        
        0.5f, 0.5f, -1.0f,      1.0f, 1 - 1.0f,
        -0.5f, 0.5f, -1.0f,     0.0f, 1 - 1.0f,
        0.5f, -0.5f, -1.0f,     1.0f, 1 - 0.0f,
    };

2. 翻轉(zhuǎn)圖片源文件

在解壓過程中,可以對圖片的源文件進行翻轉(zhuǎn)名党,代碼如下:

 //  第二種方法:解決翻轉(zhuǎn)問題叹阔,平移再翻轉(zhuǎn)Y軸
    CGContextTranslateCTM(spriteContext, 0, rect.size.height);
    CGContextScaleCTM(spriteContext, 1.0, -1.0);
    CGContextDrawImage(spriteContext, rect, spriteImage);

第一步調(diào)CGContextTranslateCTM是把spriteContext沿Y軸正方向移動圖片的高度,然后再調(diào)CGContextScaleCTM是把圖片直接翻轉(zhuǎn)過來。

3. 通過旋轉(zhuǎn)矩陣直接旋轉(zhuǎn)圖形

在加載紋理時传睹,把圖形直接旋轉(zhuǎn)180度即可,如下先寫一個旋轉(zhuǎn)矩陣傳入頂點著色器

 //解決紋理翻轉(zhuǎn)
- (void)rotateTextureImage{
    //注意耳幢,想要獲取shader里面的變量,這里記得要在glLinkProgram后面欧啤,后面睛藻,后面!
    //1. rotate等于shaderv.vsh中的uniform屬性邢隧,rotateMatrix
    GLuint rotate = glGetUniformLocation(self.myPrograme, "rotateMatrix");
    //2.獲取渲旋轉(zhuǎn)的弧度
    float radias = 180 * 3.1415926 / 180.0f;
    
    //3.求得弧度對于的sin\cos值
     float s = sin(radias);
     float c  = cos(radias);
    
    //4.在OpenGL ES用的是列向量
    /*
     參考Z軸旋轉(zhuǎn)矩陣
     */
    GLfloat zRotation[16] = {
        c,-s,0,0,
        s,c,0,0,
        0,0,1,0,
        0,0,0,1
    };
    //5.設(shè)置旋轉(zhuǎn)矩陣
    /*
     glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat* value)
     location : 對于shader 中的ID
     count : 個數(shù)
     transpose : 轉(zhuǎn)置
     value : 指針
     */
    glUniformMatrix4fv(rotate, 1, GL_FALSE, zRotation);
}

在頂點著色器中店印,代碼如下所示, 上面是把旋轉(zhuǎn)矩陣rotateMatrix傳入了,然后設(shè)置頂點坐標gl_Postion時倒慧,用傳入的原始頂點和傳入的roatateMatrix相乘即可完成旋轉(zhuǎn)180度按摘。

attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;

varying lowp vec2 varyTextCoord;

void main()
{
    varyTextCoord = textCoordinate;
    vec4 pox = position;
    gl_Position = pox *rotateMatrix;
}

4. 修改著色器里的紋理坐標

我們可以修改頂點著色器里的紋理坐標或者修改片元著色器里的紋理坐標,兩種方式原理是一樣的迫靖。

修改頂點著色器

attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;

void main()
{
    varyTextCoord = vec2(textCoordinate.x,1.0 - textCoordinate.y);
    gl_Position = position;
}
修改片元著色器
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));
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末院峡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子系宜,更是在濱河造成了極大的恐慌照激,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盹牧,死亡現(xiàn)場離奇詭異俩垃,居然都是意外死亡,警方通過查閱死者的電腦和手機汰寓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門口柳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人有滑,你說我怎么就攤上這事跃闹。” “怎么了毛好?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵望艺,是天一觀的道長。 經(jīng)常有香客問我肌访,道長找默,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任吼驶,我火速辦了婚禮惩激,結(jié)果婚禮上店煞,老公的妹妹穿的比我還像新娘。我一直安慰自己风钻,他們只是感情好顷蟀,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骡技,像睡著了一般衩椒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哮兰,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機與錄音苟弛,去河邊找鬼喝滞。 笑死,一個胖子當著我的面吹牛膏秫,可吹牛的內(nèi)容都是我干的右遭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼缤削,長吁一口氣:“原來是場噩夢啊……” “哼窘哈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起亭敢,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤滚婉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帅刀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體让腹,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年扣溺,在試婚紗的時候發(fā)現(xiàn)自己被綠了骇窍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡锥余,死狀恐怖腹纳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驱犹,我是刑警寧澤嘲恍,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站着绷,受9級特大地震影響蛔钙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荠医,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一吁脱、第九天 我趴在偏房一處隱蔽的房頂上張望桑涎。 院中可真熱鬧,春花似錦兼贡、人聲如沸攻冷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽等曼。三九已至,卻和暖如春凿蒜,著一層夾襖步出監(jiān)牢的瞬間禁谦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工废封, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留州泊,地道東北人。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓漂洋,卻偏偏與公主長得像遥皂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子刽漂,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容