I used a custom shader in my cocos2d-x game to show spotlight effect. it working properly on iPhone but it not working android device. It shows black screen.
I got reference from this link https://github.com/wantnon/2D-lighting
Following is my Sprite subclass
And this is CmaskedSceneSprite.cpp
bool CmaskedSceneSprite::init(Texture2D *texture) {
if(Sprite::initWithTexture(texture))
{
Size texSize=this->getContentSize();
//mask shader
{
GLchar * fragSource = (GLchar*)FileUtils::getInstance()->getStringFromFile("mask.fsh").c_str();
GLProgram* pProgram = new GLProgram();
pProgram->reset();
pProgram->initWithByteArrays(ccPositionTextureColor_vert, fragSource);
//bind attribute
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);
//link (must after bindAttribute)
pProgram->link();
//get cocos2d-x build-in uniforms
pProgram->updateUniforms();
//get my own uniforms
map<string,GLint> myUnifoMap;
myUnifoMap["texSize"] = glGetUniformLocation(pProgram->getProgram(),"texSize");
myUnifoMap["r"] = glGetUniformLocation(pProgram->getProgram(),"r");
myUnifoMap["c"] = glGetUniformLocation(pProgram->getProgram(),"c");
myUnifoMap["brightColor"] = glGetUniformLocation(pProgram->getProgram(),"brightColor");
myUnifoMap["darkColor"] = glGetUniformLocation(pProgram->getProgram(),"darkColor");
//make program
program.myUnifoMap=myUnifoMap;
program.setProgram(pProgram);
//program can be released
pProgram->release();
//check gl error
CHECK_GL_ERROR_DEBUG();
}
}
return true;
}
void CmaskedSceneSprite::draw(Renderer *renderer, const Mat4& transform, uint32_t flags) {
//call father draw
Sprite::draw(renderer,transform, flags);
Size texSize = this->getContentSize();
//----change shader
this->setGLProgram(program.getProgram());
//ccGLEnable(m_eGLServerState);
//pass values for cocos2d-x build-in uniforms
getGLProgram()->use();
getGLProgram()->setUniformsForBuiltins();
//pass values for my own uniforms
float texSize_c[2]={texSize.width,texSize.height};
glUniform2fv(program.myUnifoMap["texSize"],1,texSize_c);
glUniform1f(program.myUnifoMap["r"], r);
float c_c[2]={c.x,c.y};
glUniform2fv(program.myUnifoMap["c"], 1, c_c);
glUniform4fv(program.myUnifoMap["brightColor"], 1, brightColor);
glUniform4fv(program.myUnifoMap["darkColor"], 1, darkColor);
}
and this my custom shader program mask.fsh
#ifdef GL_ES
precision mediump float;
#endif
varying vec2 v_texCoord;
uniform sampler2D CC_Texture01;
uniform vec2 texSize;
uniform float r;
uniform vec2 c;
uniform vec4 brightColor;
uniform vec4 darkColor;
void main() {
vec2 texCoord=vec2(v_texCoord.s,1.0-v_texCoord.t);
vec4 brightColor = max(brightColor,darkColor);
vec4 darkColor = min(brightColor,darkColor);
vec2 curPixelPos = vec2(texCoord.s*texSize.x,texCoord.t*texSize.y);//curPixel pos in world space
float dis_curPixelToC = distance(curPixelPos,c);
vec4 curPixelColor;
if(dis_curPixelToC<r){
//use the curve y=1/(r*r)*x*x-2/r*x+1
//float temp=max(0.0,1.0-dis_curPixelToC/r);
//float k=temp*temp;
//curPixelColor=(brightColor-darkColor)*k+darkColor;
//use the curve y=x
curPixelColor=brightColor-(brightColor-darkColor)/r*dis_curPixelToC;
}else{
curPixelColor=darkColor;
}
gl_FragColor = texture2D(CC_Texture01, texCoord)*curPixelColor;
}
Please help me this code working on iPhone. Only on android device it not working.