最新教程和源碼請訪問公衆號
本來採用更改圖片像素點變灰,現在需要還原,便用shader,發現變灰和還原後悔改變圖片的位置,於是又尋找解決辦法~
變灰和還原的函數
void addGray(Sprite* sprite)
{
if(sprite)
{
GLProgram * p = new GLProgram();
p->initWithFilenames("gray.vsh", "gray.fsh");
p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION, GLProgram::VERTEX_ATTRIB_POSITION);
p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR, GLProgram::VERTEX_ATTRIB_COLOR);
p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD, GLProgram::VERTEX_ATTRIB_TEX_COORDS);
p->link();
p->updateUniforms();
sprite->setShaderProgram(p);
}
}
網上down的gray.vsh變灰後改變位置解決辦法:CC_MVPMatrix 改爲CC_PMatrix
void removeGray(Sprite* sprite)
{
CCGLProgram* p = CCShaderCache::sharedShaderCache()->programForKey(GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP);
sprite->setShaderProgram(p);
}
還原本應該設置爲GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR,但是有會發生位置改變~所以改爲GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP
使用自己的shader,會崩潰,解決辦法:
std::string GLProgram::logForOpenGLObject(GLuint object, GLInfoFunction infoFunc, GLLogFunction logFunc) const
{
std::string ret;
GLint logLength = 0, charsWritten = 0;
//infoFunc(object, GL_INFO_LOG_LENGTH, &logLength); //這裏就崩潰了~~ 不知道爲什麼
glGetShaderiv(object, GL_INFO_LOG_LENGTH, &logLength); //直接改成調用opengel函數,
if (logLength < 1)
return "";
char *logBytes = (char*)malloc(logLength);
// logFunc(object, logLength, &charsWritten, logBytes); //同上
glGetShaderInfoLog(object, logLength, &charsWritten, logBytes);
ret = logBytes;
free(logBytes);
return ret;
}
文件:
gray.fsh:
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
vec4 v_orColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
float gray = dot(v_orColor.rgb, vec3(0.299, 0.587, 0.114));
gl_FragColor = vec4(gray, gray, gray, v_orColor.a);
}
gray.vsh:
attribute vec4 a_position;
attribute vec2 a_texCoord;
attribute vec4 a_color;
varying vec4 v_fragmentColor;
varying vec2 v_texCoord;
void main()
{
gl_Position = CC_PMatrix * a_position;
v_fragmentColor = a_color;
v_texCoord = a_texCoord;
}