OpenGL ES 3.0 —— 2.著色器

在上一節(jié)中有介紹道OpenGL ES管線階段淋肾,在這一節(jié)主要介紹一下vertex shader和fragment shader骡显。
簡單來說合搅,在頂點(diǎn)處理階段會(huì)對(duì)傳入渲染管線的每個(gè)頂點(diǎn)執(zhí)行頂點(diǎn)著色器中的內(nèi)容殊霞,在光柵化過程中會(huì)對(duì)未被裁剪的頂點(diǎn)執(zhí)行片元著色器中的內(nèi)容(可以通過對(duì)紋理進(jìn)行取樣或者使用其他技術(shù)來確定像素的顏色)蒋歌。
著色器程序的創(chuàng)建與C/C++程序的創(chuàng)建相似帅掘。首先需要編寫著色器程序文本,其次將Shader源程序逐個(gè)編譯成Shader對(duì)象堂油,之后將編譯好的Shader對(duì)象鏈接到一個(gè)單獨(dú)的程序?qū)ο笾胁⑵漭d入到 GPU修档。
我們?cè)陧?xiàng)目中創(chuàng)建Shader.vsh和Shader.fsh兩個(gè)文件,分別添加如下代碼:

#version 300 es // 指定版本

in vec4 position;

void main()
{
    gl_Position = position;
}

··

#version 300 es
precision mediump float;  // 指定精度

out vec4 fragColor;

void main()
{
    fragColor = vec4(1.0,1.0,1.0,1.0); // 輸出白色
}

并在ViewController.mm中聲明以下幾個(gè)方法:

// 根據(jù)路徑讀取文件內(nèi)容
char* LoadAssetContent(const char*path)
{
    char*assetContent=nullptr;
    NSString*nsPath=[[NSBundle mainBundle] pathForResource:[NSString stringWithUTF8String:path] ofType:nil];
    NSData *data=[NSData dataWithContentsOfFile:nsPath];
    assetContent=new char[[data length]+1];
    memcpy(assetContent, [data bytes], [data length]);
    assetContent[[data length]]='\0';
    return assetContent;
}

// 根據(jù)代碼編譯著色器
GLuint CompileShader(GLenum shaderType,const char*code)
{
    //create shader object in gpu
    GLuint shader=glCreateShader(shaderType);
    //transform src to gpu & asign to the shader object
    glShaderSource(shader, 1, &code, NULL);
    glCompileShader(shader);
    GLint compileStatus=GL_TRUE;
    glGetShaderiv(shader, GL_COMPILE_STATUS, &compileStatus);
    if(compileStatus==GL_FALSE)
    {
        printf("compile shader error,shader code is : %s\n",code);
        char szBuffer[1024]={0};
        GLsizei logLen=0;
        glGetShaderInfoLog(shader, 1024, &logLen, szBuffer);
        printf("error log : %s\n",szBuffer);
        glDeleteShader(shader);
        return 0;
    }
    return shader;
}

// 根據(jù)編譯好的Shader鏈接程序
GLuint CreateGPUProgram(const char*vsCode,const char*fscode)
{
    GLuint program;
    //compile source code
    //.cpp .mm .m -> .o
    GLuint vsShader=CompileShader(GL_VERTEX_SHADER, vsCode);
    GLuint fsShader=CompileShader(GL_FRAGMENT_SHADER, fscode);
    //link .o -> executable file
    program=glCreateProgram();
    glAttachShader(program, vsShader);
    glAttachShader(program, fsShader);
    glLinkProgram(program);
    GLint programStatus=GL_TRUE;
    glGetProgramiv(program, GL_LINK_STATUS, &programStatus);
    if(GL_FALSE==programStatus)
    {
        printf("link program error!");
        char szBuffer[1024]={0};
        GLsizei logLen=0;
        glGetProgramInfoLog(program, 1024, &logLen, szBuffer);
        printf("link error : %s\n",szBuffer);
        glDeleteProgram(program);
        return 0;
    }
    return program;
}

聲明一個(gè)GLuint gpuProgram府框,執(zhí)行gpuProgram=CreateGPUProgram(LoadAssetContent("shader.vsh"),LoadAssetContent("shader.fsh"));,如果gpuProgram不等于0吱窝,意味著程序創(chuàng)建成功。

注:頂點(diǎn)著色器和片元著色器包含自建變量迫靖,如gl_Position(輸出頂點(diǎn)位置的剪裁坐標(biāo))和gl_PointSize(點(diǎn)精靈尺寸)院峡。想要具體了解著色器自建變量可查閱OpenGL ES 3.0編程指南8.1和10.2。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末系宜,一起剝皮案震驚了整個(gè)濱河市照激,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盹牧,老刑警劉巖俩垃,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異欢策,居然都是意外死亡吆寨,警方通過查閱死者的電腦和手機(jī)赏淌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門踩寇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人六水,你說我怎么就攤上這事俺孙。” “怎么了掷贾?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵睛榄,是天一觀的道長。 經(jīng)常有香客問我想帅,道長场靴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮旨剥,結(jié)果婚禮上咧欣,老公的妹妹穿的比我還像新娘。我一直安慰自己轨帜,他們只是感情好魄咕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚌父,像睡著了一般哮兰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苟弛,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天喝滞,我揣著相機(jī)與錄音,去河邊找鬼膏秫。 笑死囤躁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荔睹。 我是一名探鬼主播狸演,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼僻他!你這毒婦竟也來了宵距?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤吨拗,失蹤者是張志新(化名)和其女友劉穎满哪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劝篷,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡哨鸭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了娇妓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片像鸡。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖哈恰,靈堂內(nèi)的尸體忽然破棺而出只估,到底是詐尸還是另有隱情,我是刑警寧澤着绷,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布蛔钙,位于F島的核電站,受9級(jí)特大地震影響荠医,放射性物質(zhì)發(fā)生泄漏吁脱。R本人自食惡果不足惜桑涎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兼贡。 院中可真熱鬧石洗,春花似錦、人聲如沸紧显。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孵班。三九已至涉兽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間篙程,已是汗流浹背枷畏。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虱饿,地道東北人拥诡。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像氮发,于是被迫代替她去往敵國和親渴肉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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