Reputation: 627
I'm trying to add a gradient to a texture in Cocos2dx 2, OpenGL ES2. But the OpenGL content is not getting rendered.
This code is based on the tutorial link: http://www.raywenderlich.com/3857/how-to-create-dynamic-textures-with-ccrendertexture
CCRenderTexture *rt = CCRenderTexture::create((int)textureSize, (int)textureSize);
rt->beginWithClear(bgColor.r, bgColor.g, bgColor.b, bgColor.a);
float gradientAlpha = 0.5;
CCPoint vertices[4];
ccColor4F colors[4];
int nVertices = 0;
vertices[nVertices] = CCPointMake(0, 0);
colors[nVertices++] = ccc4f(0, 0, 0, 0);
vertices[nVertices] = CCPointMake(textureSize, 0);
colors[nVertices++] = ccc4f(0, 0, 0, 0);
vertices[nVertices] = CCPointMake(0, textureSize);
colors[nVertices++] = ccc4f(0, 0, 0, gradientAlpha);
vertices[nVertices] = CCPointMake(textureSize, textureSize);
colors[nVertices++] = ccc4f(0, 0, 0, gradientAlpha);
// Set the shader program for OpenGL
setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionColor));
CC_NODE_DRAW_SETUP();
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_FLOAT, GL_FALSE, 0, colors);
ccGLBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);
glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)nVertices);
CCSprite* noise = CCSprite::create("Noise.png");
ccBlendFunc blendFunc;
blendFunc.src = GL_DST_COLOR;
blendFunc.dst = GL_ZERO;
noise->setBlendFunc(blendFunc);
noise->setPosition(ccp(textureSize / 2, textureSize / 2));
noise->visit();
rt->end();
return CCSprite::createWithTexture(rt->getSprite()->getTexture());
Please let me know if I'm doing something wrong. Thank you.
Upvotes: 3
Views: 2791
Reputation: 627
Looks like we've to use ccVertex2F instead of CCPoint for the vertices.
Moreover, the blend function is not explicitly required for drawing the gradient.
Here is the updated C++ code:
float gradientAlpha = 0.5;
ccVertex2F vertices[4];
ccColor4F colors[4];
int nVertices = 0;
vertices[nVertices] = vertex2(0, 0);
colors[nVertices++] = ccc4f(0, 0, 0, 0);
vertices[nVertices] = vertex2(textureSize, 0);
colors[nVertices++] = ccc4f(0, 0, 0, 0);
vertices[nVertices] = vertex2(0, textureSize);
colors[nVertices++] = ccc4f(0, 0, 0, gradientAlpha);
vertices[nVertices] = vertex2(textureSize, textureSize);
colors[nVertices++] = ccc4f(0, 0, 0, gradientAlpha);
// Set the shader program for OpenGL
setShaderProgram(CCShaderCache::sharedShaderCache()->programForKey(kCCShader_PositionColor));
CC_NODE_DRAW_SETUP();
ccGLEnableVertexAttribs(kCCVertexAttribFlag_Position | kCCVertexAttribFlag_Color);
glVertexAttribPointer(kCCVertexAttrib_Position, 2, GL_FLOAT, GL_FALSE, 0, vertices);
glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_FLOAT, GL_FALSE, 0, colors);
glDrawArrays(GL_TRIANGLE_STRIP, 0, (GLsizei)nVertices);
Upvotes: 4
Reputation: 3182
I am not pretty sure about how is that works, but if you just want something with Gradient color, you can try or check the source code of CCLayerGradient, here is the link http://www.cocos2d-x.org/reference/native-cpp/d9/d19/classcocos2d_1_1_c_c_layer_gradient.html
Upvotes: 1