在cocos2d中使用shader

cocos2d2.0以後,關於圖像處理部分已經全部改爲使用shader來進行,下面我們來看看shader的使用過程吧。

首先,shader可以分爲2類,一類是自定義的,一類是cocos2d提供的一些默認shader2者使用的方法有所不同。

  • cocos2d提供的默認shader

const GLchar * ccPosition_uColor_frag = 

#import "ccShader_Position_uColor_frag.h"

const GLchar * ccPosition_uColor_vert =

#import "ccShader_Position_uColor_vert.h"

//

const GLchar * ccPositionColor_frag =

#import "ccShader_PositionColor_frag.h"

const GLchar * ccPositionColor_vert =

#import "ccShader_PositionColor_vert.h"

//

const GLchar * ccPositionTexture_frag =

#import "ccShader_PositionTexture_frag.h"

const GLchar * ccPositionTexture_vert =

#import "ccShader_PositionTexture_vert.h"

//

const GLchar * ccPositionTextureA8Color_frag =

#import "ccShader_PositionTextureA8Color_frag.h"

const GLchar * ccPositionTextureA8Color_vert =

#import "ccShader_PositionTextureA8Color_vert.h"

//

const GLchar * ccPositionTextureColor_frag =

#import "ccShader_PositionTextureColor_frag.h"

const GLchar * ccPositionTextureColor_vert =

#import "ccShader_PositionTextureColor_vert.h"

//

const GLchar * ccPositionTextureColorAlphaTest_frag = 

#import "ccShader_PositionTextureColorAlphaTest_frag.h"

//

const GLchar * ccPositionTexture_uColor_frag = 

#import "ccShader_PositionTexture_uColor_frag.h"

const GLchar * ccPositionTexture_uColor_vert = 

#import "ccShader_PositionTexture_uColor_vert.h"

這些shader被包裝在CCShaderCache類中,如果要調用,可以通過以下函數來進行

1、初始化shader以及shaderProgram

self.shaderProgram = [[CCShaderCachesharedShaderCache]programForKey:kCCShader_PositionTextureColor]

2、使用shader

[shaderProgram_ use]

3、決定使用哪些屬性

ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex )

4、爲各個屬性賦值,這些值將傳入shader

// vertex

NSInteger diff =offsetof(ccV3F_C4B_T2F,vertices);

glVertexAttribPointer(kCCVertexAttrib_Position,3,GL_FLOAT, GL_FALSE,kQuadSize, (void*) (offset + diff));

// texCoods

diff = offsetof(ccV3F_C4B_T2F,texCoords);

glVertexAttribPointer(kCCVertexAttrib_TexCoords,2,GL_FLOAT, GL_FALSE,kQuadSize, (void*)(offset + diff));

// color

diff = offsetof(ccV3F_C4B_T2F,colors);

glVertexAttribPointer(kCCVertexAttrib_Color,4,GL_UNSIGNED_BYTE,GL_TRUE, kQuadSize, (void*)(offset + diff));

5、畫出圖形

glDrawArrays(GL_TRIANGLE_STRIP,0,4);

  • 自定義的Shader

這方面的主要函數都被包裝在CCGLProgram類中

1、初始化shaderProgram

self.shaderProgram = [[CCGLProgramalloc]initWithVertexShaderByteArray:ccPositionTextureColor_vertfragmentShaderByteArray:Mask_frag];

2、將shader中的屬性變量與訪問索引綁定起來

cocos2d提供的shader的綁定方法:

[shaderProgram_addAttribute:kCCAttributeNamePositionindex:kCCVertexAttrib_Position];

[shaderProgram_addAttribute:kCCAttributeNameColorindex:kCCVertexAttrib_Color];

[shaderProgram_addAttribute:kCCAttributeNameTexCoordindex:kCCVertexAttrib_TexCoords];

3、鏈接shaderProgram_

[shaderProgram_link];

4、將程序中與shader中的各個參數綁定起來

如果前面屬性變量沒有綁定,那麼也可以通過以下方式綁定

_positionSlot = glGetAttribLocation(shaderProgram_->program_,, "a_Position");

UniForms矩陣與shader中的矩陣綁定

[shaderProgram_updateUniforms];

自定義Shader變量的獲取方法:

_maskLocation = glGetUniformLocation(shaderProgram_->program_,"u_mask");

5、使用Shader

[shaderProgram_use];

6、設置傳入shader中的參數

//投影矩陣

[shaderProgram_setUniformForModelViewProjectionMatrix];

//屬性參數

glVertexAttribPointer(kCCVertexAttrib_Position,3,GL_FLOAT, GL_FALSE,kQuadSize, (void*) (offset + diff));

//自定義參數

[shaderProgram_setUniformLocation:_maskLocationwithI1:1];

7、畫圖

glDrawArrays(GL_TRIANGLE_STRIP,0,4);



發佈了29 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章