使用OpenGL shader做一个能变灰的精灵
.h
class GraySprite :public Sprite
{
public:
GraySprite();
GraySprite(constchar* fileName);
void setGray(bool bGray);
private:
bool m_bGray;
};
.cpp
GraySprite::GraySprite()
{
this->initWithFile("HelloWorld.png");
this->setAnchorPoint(Vec2(0.5,0.5));
}
GraySprite::GraySprite(constchar* fileName)
{
this->initWithFile(fileName);
this->setAnchorPoint(Vec2(0.5,0.5));
}
voidGraySprite::setGray(bool bGray)
{
if (m_bGray==bGray) {
return;
}
m_bGray = bGray;
if (bGray) {
GLchar* pszFragSource = (GLchar*)
"#ifdef GL_ES
precision mediump float;
#endif
uniform sampler2D u_texture;
varying vec2 v_texCoord;
varying vec4 v_fragmentColor;
void main(void)
{
// Convert to greyscale using NTSC weightings
vec4 col = texture2D(u_texture, v_texCoord);
float grey = dot(col.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(grey, grey, grey, col.a);
}";
GLProgram* pProgram = new GLProgram();
pProgram->initWithByteArrays(ccPositionTextureColor_noMVP_vert, pszFragSource);
this->setGLProgram(pProgram);
pProgram->release();
CHECK_GL_ERROR_DEBUG();
pProgram =this->getGLProgram();
pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION,GLProgram::VERTEX_ATTRIB_POSITION);
pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR,GLProgram::VERTEX_ATTRIB_COLOR);
pProgram->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD,GLProgram::VERTEX_ATTRIB_TEX_COORD);
CHECK_GL_ERROR_DEBUG();
pProgram->link();
CHECK_GL_ERROR_DEBUG();
pProgram->updateUniforms();
CHECK_GL_ERROR_DEBUG();
}
else{
setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP));
}
}
- 上一篇: GLSL实现图像处理
- 下一篇: OpenGL Shader 绘制天空盒_基础 2