Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cocos2dx CCRenderTexture - OpenGL ES2 not rendered

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.

like image 504
Paramesh Avatar asked Jan 19 '26 20:01

Paramesh


2 Answers

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);
like image 167
Paramesh Avatar answered Jan 22 '26 08:01

Paramesh


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

like image 34
m.ding Avatar answered Jan 22 '26 08:01

m.ding



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!