2009-09-05 9 views
1

두 개의 레이어를 그립니다. 정적 배경 텍스처 및 투명 파트가있는 텍스처 (png). 나는 아무 문제없이 배경을 정확하게 볼 수있다. 내가 뭘하고 싶은지는 상단 레이어의 투명 부분을 투명하게 볼 수 있도록 런타임에 변경되는 크기의 폴리곤 (직사각형)을 그려서 맨 위 레이어를 수정하는 것입니다.다각형이 OpenGL ES에있는 다각형이있는 곳에 투명하게 텍스처를 그리기 위해 그립니다.

나는 아이폰 용으로 Cocos2d를 사용 중이며 작성자 (# 6 참조)가 solution을 찾았으나 그의 예제에서는 다른 PNG 파일을 마스크로 사용하고 있습니다. 가변 높이와 너비로 런타임에 투명한 부분이 만들어지기 때문에 이미지가 작동하지 않습니다. 이미지 (마스크)를 반복해서 그리는 오버 헤드는 계속 생각할 것입니다.

나는 이것을 잠시 동안 연구했고, 폴리곤을 알파 채널로 그리는 것에 대해 이야기하는 사람이 몇 명 있었고이 폴리곤을이 채널로 끌어 와서 약간 투명하게 만들지는 못했다. 더 밝은 색상.

난 그냥 간단하게 뭔가를 놓친 거지 바라고 :

이 또한 어쩌면 읽기 .... 내가 GL_ONE GL_ZERO GL_ALPHA_FROM_SRC 등의 diffrent 조합의 톤을 시도

 RenderTexture *mBurnLayer = [RenderTexture renderTextureWithWidth:512 height:512]; 
    Sprite *burn = [Sprite spriteWithFile:@"bg-new.png"]; 
    [burn setPosition:cpv(480/2,320/2)]; 
    [mBurnLayer setPosition:cpv(256,256)]; 
    [mBurnLayer begin]; 
    glColorMask(TRUE, TRUE, TRUE, TRUE); 
    [burn visit]; 
    glColorMask(TRUE, TRUE, TRUE, FALSE); 
    [mBurnLayer end]; 
    [self addChild:mBurnLayer]; 

    [mBurnLayer begin]; 
    glColorMask(FALSE, FALSE, FALSE, TRUE); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
    glColor4ub(1, 1, 1, 0.5); 
    glLineWidth(10); 
    CGPoint vertices[] = { ccp(100,100), ccp(100,200), ccp(200,200), ccp(200,100) }; 
    drawPoly(vertices, 4, YES); 
    glColorMask(TRUE, TRUE, TRUE, TRUE); 

을 그냥를 필요 텍스처 클립? 셰이더 없이도 가능합니까? iPhone 3GS는 쉐이더를 처리 할 수 ​​있지만 이전 버전은 쉐이더를 처리 할 수 ​​없다는 것을 알고 있습니다.

답변

3

나는 그것을 알아 냈다. 필요가있는 누군가가 나중에 참조 할 수 있도록 코드를 작성했다.

RenderTexture *bigBackgroundLayer = [RenderTexture renderTextureWithWidth:512 height:512]; 
Sprite *bigBackgroundSprite = [Sprite spriteWithFile:@"big_bg.png"]; 
[bigBackgroundSprite setPosition:cpv(240,150)]; 
[bigBackgroundLayer setPosition:ccp(240,150)]; 
[bigBackgroundLayer begin]; 
glColorMask(TRUE, TRUE, TRUE, TRUE); 
[bigBackgroundSprite visit]; 
glColorMask(TRUE, TRUE, TRUE, FALSE); 
[bigBackgroundLayer end]; 
[self addChild:bigBackgroundLayer z:0]; 

RenderTexture *gameBoardLayer = [RenderTexture renderTextureWithWidth:512 height:512]; 
Sprite *gameBoardSprite = [Sprite spriteWithFile:@"bg-new.png"]; 
[gameBoardSprite setPosition:cpv(480/2,320/2)]; 
[gameBoardLayer setPosition:cpv(256,256)]; 
[gameBoardLayer begin]; 
glColorMask(TRUE, TRUE, TRUE, TRUE); 
[gameBoardSprite visit]; 
glColorMask(TRUE, TRUE, TRUE, FALSE); 
[gameBoardLayer end]; 
[self addChild:gameBoardLayer]; 

[gameBoardLayer begin]; 
glColorMask(FALSE, FALSE, FALSE, TRUE); 
glBlendFunc(GL_ONE, GL_ZERO); 
glColor4ub(1, 1, 1, 0.0); 
glLineWidth(10); 
CGPoint vertices[] = { ccp(100,100), ccp(100,300), ccp(300,300), ccp(300,100) }; 
drawPoly(vertices, 4, YES); 
glColorMask(TRUE, TRUE, TRUE, TRUE); 
[gameBoardLayer end]; 

이렇게하면 bigBackgroundSprite에 gameBoardSprite가 혼합됩니다. drawPoly에 내장 된 함수를 사용하면 직사각형을 선으로 그릴 것입니다. GLEnum 모드 (이 코드가 아님)에 대한 추가 매개 변수를 취하도록 함수를 수정하고이를 GL_TRIANGLE_FAN으로 설정하여 폴리를 채 웁니다.

다른 사람에게 도움이되기를 바랍니다.

관련 문제