Cocos2d-x版本3.17.1
原理
Sprite類默認(rèn)使用的著色器程序?yàn)椋?/p>
GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP
fragment shader 內(nèi)容為:
void main()
{
? ? gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
}
其中v_fragmentColor是程序中設(shè)置的頂點(diǎn)屬性顏色咙边,默認(rèn)為白色變灰的操作很簡單,fragment shader代碼改為:
void main(void)
{
? ? vec4 c = texture2D(CC_Texture0, v_texCoord);
? ? c = v_fragmentColor * c;
? ? gl_FragColor.xyz = vec3(0.2126*c.r + 0.7152*c.g + 0.0722*c.b);
? ? gl_FragColor.w = c.w;
}
前兩行計(jì)算出紋理與頂點(diǎn)屬性顏色混合后的顏色第三行通過三個(gè)系數(shù)匆赃,分別乘與RGB分量再相加,構(gòu)造一個(gè)三分量相等的vec3
實(shí)際操作:
引擎提供了一個(gè)變灰的著色器程序:
GLProgram::SHADER_NAME_POSITION_GRAYSCALE
Sprite類添加gray, ungray方法
void Sprite::gray(){
? ? Texture2D* texture = this->getTexture();
? ? auto programState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_GRAYSCALE, texture);
? ? this->setGLProgramState(programState);
}
void Sprite::ungray(){
? ? Texture2D* texture = this->getTexture();
? ? auto programState = GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP, texture);
? ? this->setGLProgramState(programState);
}
這里使用getOrCreateWithGLProgramName(const std::string, Texture2D*)方法的目的是為了兼容ETC格式的壓縮紋理格式
結(jié)語
如果使用ETC紋理格式碘举,變灰的fragment shader和上面的會(huì)有一點(diǎn)點(diǎn)不同詳細(xì)引擎==ccShader_ETC1AS_PositionTextureGray.frag==文件