cocos2d2.0以後,關於圖像處理部分已經全部改爲使用shader來進行,下面我們來看看shader的使用過程吧。
首先,shader可以分爲2類,一類是自定義的,一類是cocos2d提供的一些默認shader,2者使用的方法有所不同。
- 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);