我正在尝试在Cocos2dx 2,OpenGL ES2中为纹理添加渐变。 但是OpenGL内容没有得到渲染。
此代码基于教程链接: 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());
如果我做错了,请告诉我。谢谢。
答案 0 :(得分:4)
看起来我们要使用ccVertex2F代替CCPoint作为顶点。
此外,绘制渐变时不明确需要混合函数。
这是更新的C ++代码:
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);
答案 1 :(得分:1)
我不太确定它是如何工作的,但是如果你只想要一些渐变颜色的东西,你可以尝试或检查CCLayerGradient的源代码, 这是链接http://www.cocos2d-x.org/reference/native-cpp/d9/d19/classcocos2d_1_1_c_c_layer_gradient.html