2013-05-23 6 views
1

iPhone 용 Cocos2Dx에서 CCRenderTexture 클래스를 사용하는 데 문제가 있습니다 (이해할 수 있듯이 FBO 클래스 임).Cocos2dx CCRendertexture 및 프레임 버퍼 개체 문제. 내 새로운 질감이 똑같지는 않습니다. 알파 값이 올바르지 않습니다.

CCSprite에서 파생되는 클래스가 있습니다. 그 안에는 CCrenderTexture에 텍스처를 그리고 나중에 저장하기 위해 노력하고 있습니다. 그러나, 나는 새로운 텍스처의 알파 값이 강해진 것으로 보였다. 내 새로운 텍스처는 원본보다 약간 더 희미하게 보입니다. 단지 알파가 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)으로 바꾸려고 시도했습니다. 색상 값을 변경하면서 이것이 알파 레벨을 유지하기를 바랍니다. 불행하게도 이것은 반대의 효과가 있었고 실제로 알파를 어둡게 만들어 질감이 어둡게 보였다.

다음은 세 번의 테스트를 거친 사진입니다.)

enter image description here

사람이 내가 잘못하고 뭐하는 거지 이러한 효과의 원인이 무엇인지 말해 줄 수,이 비키니 바닥 자산 효과를 볼 쉽게 무엇입니까? 내 BlendFunc입니까? CCRenderTexture (또는 FBO)을 연속으로 여러 번 그릴 수 있어야하며 이미지에 원하지 않는 영향을 미치지 않습니다. 나는 또한 쉐이더를 사용해야합니다 ... 그래서 ccGLBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)이 작동하지 않습니다 ...

어떤 도움을 주실 수 있나요? 미리 감사드립니다!

+0

아마 미리 곱한 알파 문제 – Kreiri

답변

2

저에게 도움이되는 해결책을 찾을 수있었습니다. 이상적인지, 더 좋은 방법이 있는지 확실하지 않지만 작동하는 것 같습니다.

앞서 말했듯이 ccGLBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)을 사용하면 CCRenderTexture을 원하는만큼 사용할 수 있었지만 셰이더가 제대로 작동하지 않았습니다.

glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE, GL_SRC_ALPHA)으로 변경하면 셰이더가 허용되지만 CCRenderTexture으로 렌더링 할 때마다 텍스처가 어두워집니다.

Photoshop의 텍스처를 비교 한 결과 glBlendFuncSeparate(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE, GL_SRC_ALPHA)은 내 색상 값에 내 알파 값을 곱하는 것으로 나타났습니다. 색상 조합을 GL_ONE_MINUS_SRC_ALPHA으로 설정 했으므로 어느 것이 맞는지 생각해보십시오.

그래서 내 해결책은 내 색상 값을 쉐이더 내의 알파 값으로 나눔으로써이 효과를 뒤집는 것이 었습니다. 나는이 라인들을 쉐이더의 끝에 추가했다.

texColor.r = texColor.r/texColor.a;  \n\ 
texColor.b = texColor.b/texColor.a;  \n\ 
texColor.g = texColor.g/texColor.a;  \n\ 

이 단계가 낭비이기 때문에 조금 바보처럼 보입니다. 색상을 변경하지 않는 방법을 찾는 것이 좋습니다. 그러나 그것은 작동합니다!

관련 문제