我在尝试将 Cocos2Dx 中的 CCRenderTexture 类用于 iPhone 时遇到了一些问题(据我所知,它只是一个 FBO 类)。
我有一个派生自 CCSprite 的类。在其中,我尝试将纹理绘制到 CCrenderTexture,然后将其保存以备后用。但是,我注意到我的新纹理中的 alpha 值似乎已经增强了。我的新纹理看起来比原始纹理更褪色,它似乎只影响 alpha 小于 1.0 的像素。
这是我正在使用的代码:
CCRenderTexture* myRenderTexture = CCRenderTexture::create((int)getContentSize().width, (int)getContentSize().height); //set RenderTexture to same size as sprite
myRenderTexture->begin();
CC_NODE_DRAW_SETUP();
ccGLEnableVertexAttribs(kCCVertexAttribFlag_PosColorTex);
ccGLBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //Is this where my problem is?
glActiveTexture(GL_TEXTURE0);
glBindTexture( GL_TEXTURE_2D, finalTexture->getName()); //finalTexture is created before this code is run
glUniform1i(textureLocation, 0);
long offset = (long)&m_sQuad;
// vertex
int diff = offsetof( ccV3F_C4B_T2F, vertices);
glVertexAttribPointer(kCCVertexAttrib_Position, 3, GL_FLOAT, GL_FALSE, kQuadSize, (void*) (offset + diff));
// texCoods
diff = offsetof( ccV3F_C4B_T2F, texCoords);
glVertexAttribPointer(kCCVertexAttrib_TexCoords, 2, GL_FLOAT, GL_FALSE, kQuadSize, (void*)(offset + diff));
// color
diff = offsetof( ccV3F_C4B_T2F, colors);
glVertexAttribPointer(kCCVertexAttrib_Color, 4, GL_UNSIGNED_BYTE, GL_TRUE, kQuadSize, (void*)(offset + diff));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
glActiveTexture(GL_TEXTURE0);
myRenderTexture->end();
finalTexture = myRenderTexture->getSprite()->getTexture(); //Replace Final Texture with my new texture (Should be exact same)
finalTexture->retain();
myRenderTexture->release();
作为测试,我将上面的代码连续运行了 4 次。每一次,质地似乎都淡化了一点。但我期望它每次看起来都一样。
我采取的下一步是替换ccGLBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
它ccGLBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
似乎解决了我的问题,因为无论我运行多少次,生成的纹理看起来都是一样的。但是,我还在此纹理上运行自定义片段着色器(着色器未显示,并且在此测试期间未运行)并且它需要ccGLBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
正常工作。
经过一番研究,我尝试ccGLBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
用glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE, GL_SRC_ALPHA)
. 我希望这将保持我的 alpha 水平,同时改变颜色值。不幸的是,这产生了相反的效果,似乎实际上使 alpha 变暗,导致纹理变暗。
这是我的三个测试的图片。这个比基尼底部资产很容易看到效果;)
有人能告诉我我做错了什么以及是什么导致了这些影响吗?是我的BlendFunc
吗?我需要能够CCRenderTexture
连续多次绘制到(或 FBO),并且我不希望对图像产生任何不良影响。我还需要使用我的着色器......所以ccGLBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
不起作用......
任何帮助表示赞赏!提前致谢!