紋理翻轉(zhuǎn)

OpenGL的紋理坐標(biāo)是左下角的,而圖片的坐標(biāo)是在左上角的冰沙,所以畫(huà)上去的時(shí)候會(huì)是倒立的,有五種方法可以使圖片正過(guò)來(lái)

1.直接修改源紋理坐標(biāo)數(shù)據(jù)

//前3個(gè)是頂點(diǎn)坐標(biāo)执虹,后2個(gè)是紋理坐標(biāo)
翻轉(zhuǎn)前:
    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,//右下
    };

翻轉(zhuǎn)后:
    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,
    };

2.修改片元著色器紋理坐標(biāo)

只需要修改y軸的坐標(biāo)即可拓挥。

varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
修改前:
void main()
{
    gl_FragColor = texture2D(colorMap, varyTextCoord);
}
修改后:
void main()
{
    gl_FragColor = texture2D(colorMap, vec2(varyTextCoord.x,1.0-varyTextCoord.y));
}

3.修改頂點(diǎn)著色器紋理坐標(biāo)

片元著色器的紋理坐標(biāo)是通過(guò)頂點(diǎn)著色器傳遞過(guò)去,同理修改頂點(diǎn)著色器的紋理坐標(biāo)袋励。

attribute vec4 position;
attribute vec2 textCoordinate;
varying lowp vec2 varyTextCoord;
修改前:
void main()
{
    varyTextCoord = textCoordinate;
    gl_Position = position;
}
修改后:
void main()
{
    varyTextCoord = vec2(textCoordinate.x,1.0-textCoordinate.y);
    gl_Position = position;
}

4.旋轉(zhuǎn)矩陣翻轉(zhuǎn)圖形,不翻轉(zhuǎn)紋理

讓圖形頂點(diǎn)坐標(biāo)旋轉(zhuǎn)180°. 而紋理保持原狀


- (void)rotateTextureImage
{
    //注意侥啤,想要獲取shader里面的變量,這里記得要在glLinkProgram后面茬故,后面盖灸,后面!
    //rotate等于shaderv.vsh中的uniform屬性磺芭,rotateMatrix
    GLuint rotate = glGetUniformLocation(self.myPrograme, "rotateMatrix");
    float radians = 180 * 3.14159f / 180.0f;
    float s = sin(radians);
    float c = cos(radians);
    GLfloat zRotation[16] = {
        c,-s,0,0,
        s,c,0,0,
        0,0,1,0,
        0,0,0,1
    };
    glUniformMatrix4fv(rotate, 1, GL_FALSE, zRotation);
}
//對(duì)應(yīng)的shaderv.vsh
attribute vec4 position;
attribute vec2 textCoordinate;
uniform mat4 rotateMatrix;

varying lowp vec2 varyTextCoord;

void main()
{
    varyTextCoord = textCoordinate;
    //讓每一個(gè)頂點(diǎn)坐標(biāo)應(yīng)用旋轉(zhuǎn)矩陣
    gl_Position = position * rotateMatrix;
}

上面主要參考的是圍繞Z軸旋轉(zhuǎn)


image.png

5.圖片解壓縮時(shí)赁炎,翻轉(zhuǎn)源文件

    CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
    size_t width = CGImageGetWidth(spriteImage);
    size_t height = CGImageGetHeight(spriteImage);
    //獲取圖片字節(jié)數(shù) 寬*高*4(RGBA)
    GLubyte * spriteData = (GLubyte *) calloc(width * height * 4, sizeof(GLubyte));
    
    //創(chuàng)建上下文
    /*
     參數(shù)1:data,指向要渲染的繪制圖像的內(nèi)存地址
     參數(shù)2:width,bitmap的寬度,單位為像素
     參數(shù)3:height,bitmap的高度钾腺,單位為像素
     參數(shù)4:bitPerComponent,內(nèi)存中像素的每個(gè)組件的位數(shù)徙垫,比如32位RGBA讥裤,就設(shè)置為8
     參數(shù)5:bytesPerRow,bitmap的沒(méi)一行的內(nèi)存所占的比特?cái)?shù)
     參數(shù)6:colorSpace,bitmap上使用的顏色空間  kCGImageAlphaPremultipliedLast:RGBA
     */
    CGContextRef spriteContext = CGBitmapContextCreate(spriteData, width, height, 8, width*4,CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);
    //在CGContextRef上--> 將圖片繪制出來(lái)
    /*
     CGContextDrawImage 使用的是Core Graphics框架,坐標(biāo)系與UIKit 不一樣松邪。
     UIKit框架的原點(diǎn)在屏幕的左上角坞琴,Core Graphics框架的原點(diǎn)在屏幕的左下角。
     CTM(current transformation matrix當(dāng)前轉(zhuǎn)換矩陣)
    */
    CGContextTranslateCTM(spriteContext, 0, rect.size.height);
    CGContextScaleCTM(spriteContext, 1.0, -1.0);
    CGContextDrawImage(spriteContext, rect, spriteImage);
    CGContextRelease(spriteContext);
    
    //綁定紋理到默認(rèn)的紋理ID
    glBindTexture(GL_TEXTURE_2D, 0);
    free(spriteData);   
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末逗抑,一起剝皮案震驚了整個(gè)濱河市剧辐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌邮府,老刑警劉巖荧关,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異褂傀,居然都是意外死亡忍啤,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門仙辟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)同波,“玉大人,你說(shuō)我怎么就攤上這事叠国∥撮荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵粟焊,是天一觀的道長(zhǎng)冤狡。 經(jīng)常有香客問(wèn)我,道長(zhǎng)项棠,這世上最難降的妖魔是什么悲雳? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮香追,結(jié)果婚禮上合瓢,老公的妹妹穿的比我還像新娘。我一直安慰自己翅阵,他們只是感情好歪玲,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著掷匠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岖圈。 梳的紋絲不亂的頭發(fā)上讹语,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蜂科,去河邊找鬼顽决。 笑死短条,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的才菠。 我是一名探鬼主播茸时,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼赋访!你這毒婦竟也來(lái)了可都?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蚓耽,失蹤者是張志新(化名)和其女友劉穎渠牲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體步悠,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡签杈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼎兽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片答姥。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谚咬,靈堂內(nèi)的尸體忽然破棺而出鹦付,到底是詐尸還是另有隱情,我是刑警寧澤序宦,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布睁壁,位于F島的核電站,受9級(jí)特大地震影響互捌,放射性物質(zhì)發(fā)生泄漏潘明。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一秕噪、第九天 我趴在偏房一處隱蔽的房頂上張望钳降。 院中可真熱鬧,春花似錦腌巾、人聲如沸遂填。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)吓坚。三九已至,卻和暖如春灯荧,著一層夾襖步出監(jiān)牢的瞬間礁击,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哆窿,地道東北人链烈。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挚躯,于是被迫代替她去往敵國(guó)和親强衡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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