2017-09-30 4 views
0

다른 액터와 교차하는 액터가 있습니다. 그리고 그 부분을 잘라 내야합니다. 터치 한 다른 객체를 기반으로 텍스처를 자르는 방법은 무엇입니까?

enter image description here

이 사각형은 이미지의 배우가 라인을 따라 무작위로 나타날 수 있습니다 또한 이미지의 배우

enter image description here

입니다.

enter image description here 그리고 이것은 내가 얻고 자했던 결과의 샘플입니다. libgdx로 이것을 달성하는 방법에 대한 조언이 필요합니다.

[편집]

으로 내가 버퍼에 그리는 FBO를 사용하는 것을 시도하고 좋습니다. 아래는 현재 작업중인 코드입니다.

@Override 
public void draw(Batch batch, float parentAlpha) { 

    fbo.begin(); 
    getStage().getViewport().apply(); 

    Gdx.gl.glClearColor(0f,0f,0f,0f); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    batch.draw(trLine,position.x,position.y); 
    batch.flush(); 

    fbo.end(); 
    getStage().getViewport().apply(); 

    batch.draw(fbo.getColorBufferTexture(),0,0); 

} 

나는 버퍼로 무승부를 버퍼링하고 나중에 그릴 수 있어요하지만 다른 크기 될 일이. 아래는 생성 및 fbo의 처분에 대한 코드입니다. 그리기 루프 외부에 있습니다. [FBO 해결]

fbo = new FrameBuffer(Pixmap.Format.RGBA8888,getStage().getViewport().getWidth(),getStage().getViewport().getHeight(),false,true); 

는 아래 FBO 작업 한 부호화하지만 예상대로 혼합 작동되지 않는다. 작동 할 때까지 계속 노력할 것입니다.

fbo.begin(); 

Gdx.gl.glClearColor(0f,0f,0f,0f); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

batch.begin(); 
batch.draw(trLine,position.x,position.y); 
batch.end(); 


int srcFunc = batch.getBlendSrcFunc(); 
int dstFunc = batch.getBlendDstFunc(); 

batch.enableBlending(); 
batch.begin(); 
batch.setBlendFunction(GL20.GL_ONE, GL20.GL_FUNC_REVERSE_SUBTRACT); 
for(int i = 0 ; i < cropRectangles.size() ; i++){ batch.draw(cropTexture.get(i),cropRectangles.get(i).x,cropRectangles.get(i).y); 
} 
batch.end(); 

fbo.end(); 

getStage().getViewport().apply(); 

//reset blending before drawing the desire result 
batch.begin(); 
batch.setBlendFunction(srcFunc, dstFunc); 
batch.draw(fbo.getColorBufferTexture(),0,0); 
batch.end(); 

그러나 출력에는 블렌딩 효과가 없습니다. 흰색으로 채워진 사각형입니다.

enter image description here

드디어 제대로 방정식을 적용

[이 해결 FULL CODE]하고 나는이 후 그릴 다른 것들에 영향을주지 않도록를 재설정 할 수.

fbo.begin(); 

Gdx.gl.glClearColor(0f,0f,0f,0f); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

batch.begin(); 
batch.draw(trLine,position.x,position.y); 
batch.end(); 


int srcFunc = batch.getBlendSrcFunc(); 
int dstFunc = batch.getBlendDstFunc(); 



batch.enableBlending(); 

batch.begin(); 
batch.setBlendFunction(GL20.GL_ONE, GL20.GL_ONE_MINUS_SRC_ALPHA); 
Gdx.gl.glBlendEquation(GL20.GL_FUNC_REVERSE_SUBTRACT); 

for(int i = 0 ; i < cropRectangles.size() ; i++){ 

       batch.draw(cropTexture.get(i),cropRectangles.get(i).x,cropRectangles.get(i).y); 

} 

batch.end(); 
batch.flush(); 

fbo.end(); 

Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD); 

getStage().getViewport().apply(); 

batch.begin(); 
batch.setBlendFunction(srcFunc, dstFunc); 
batch.draw(fbo.getColorBufferTexture(),0,0); 
batch.end(); 
+0

위의 예가 없기 때문에 사진의 일부를 잘라내는 것이 무슨 뜻인지 잘 모르겠습니다. 마지막 그림에서 선과 직사각형을 그릴 것입니다. 스테이지를 사용하는 경우 액터를 그려야하는 순서대로 스테이지에 추가해야 함을 의미합니다. 레이어를 나타내는 그룹 (https://stackoverflow.com/a/17558220/506796 – Tenfour04

+0

)을 사용하면 프레임이 투명 해지고 프레임 아래에 개체가 거의 없기 때문에이 작업을보다 쉽게 ​​제어 할 수 있습니다. 특정 배우를 만질 때 줄무늬를 만들 수있는 방법이 있습니까? –

+0

가위는 어떻게 작동하는지 거의 이해하지 못했지만 가위를 뒤집을 수있는 다른 방법이 있습니까? 직사각형을 넣고 선의 일부를 잘라내는 것처럼? (라인 만) –

답변

1

블렌드 모드를 사용하면이 효과를 얻을 수 있습니다. 사각형에는 2 개의 부분이 있어야합니다. 외부와 투명한 부분.

바깥 부분은 평상시처럼 실제로 그릴 부분입니다.

투명한 부분은 완전한 알파를 가진 다른 사각형이며이 부분에 블렌딩을 사용해야합니다.

examplemode

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glBlendEquation(GL_FUNC_REVERSE_SUBTRACT); 

Visual Blending Tool

이 모드 청산 교차 지역, 그것은 올바른 모드처럼 보인다.

libgdx에서 블렌딩의 예제 사용법을 easly 찾을 수 있습니다.

SpriteBatch sb = (SpriteBatch)batch; 

    // draw our destination image 
    sb.draw(dst, 0, 0); 
    sb.end(); 

    // remember SpriteBatch's current functions 
    int srcFunc = sb.getBlendSrcFunc(); 
    int dstFunc = sb.getBlendDstFunc(); 

    // Let's enable blending 
    sb.enableBlending(); 
    sb.begin(); 

    // blend them 
    sb.setBlendFunction(GL20.GL_ONE, GL20.ONE_MINUS_SRC_ALPHA); 
    sb.draw(src, 0, 0); 

    // Reset 
    sb.end(); 
    sb.begin(); 
    sb.setBlendFunction(srcFunc, dstFunc); 

또한 혼합 수식도 변경해야합니다. 그리고 스프라이트 배치에는 유일하지 않으므로 모든 게임에서 변경해야합니다.

//Equation for effect you want  
Gdx.gl.glBlendEquation(GL20.GL_FUNC_REVERSE_SUBTRACT); 

//After draw you should also reset this 
Gdx.gl.glBlendEquation(GL20.GL_FUNC_ADD); 

투명 영역에는 스프라이트 배치의 배경색이 표시되므로이 그림을 FrameBufferObject로 가져와야합니다. 만약 당신이 좋아한다면 그것은 끝났지 만, 배경 이미지 같은 무언가 또는이 투명 영역에서 다른 텍스처를 보길 원합니다.

당신은이 문서를 읽어야 뭐죠 FBO의 목적 (FrameBufferObject)

Frame Buffer from official wiki 당신은 전체 이미지로 사람들을 사용을 통해 볼 수 있도록 병합에 대한 귀하의 스프라이트와 투명한 영역을이를 사용할 필요가

투명 영역에서 배경 이미지.

두 번째 뷰포트 또는 스프라이트 배치를 사용하는 것이 게임에 따라 더 쉽고 훨씬 효율적일 수 있습니다.

+0

블렌딩에 프레임 버퍼를 구현하는 방법에 대한 몇 가지 코드를 제공 할 수 있습니까? 또는 질문에 대한 코드를 업데이트해야합니다. 아직 전체 프로젝트에 영향을 줄 수 있으므로이 작업을 수행하려고합니다. –

+0

Framebuffer가 새로운 질감을 돌려줍니다. framebuffer.getTexture(); 그런 다음 정규 질감으로 블렌딩하면됩니다. https://stackoverflow.com/questions/25347456/how-to-do-blending-in-libgdx Google에서 블렌딩의 libgdx 예를 찾을 수 있습니다. –

+0

죄송합니다. 배우와 함께 fbo 작업을 할 수 없습니다. 배우 안에 있기 때문에. 나는 fbo에게 정규 무승부를하고, 그 결과는 무대에서 정상 무승부와 다르다. 크기와 좌표가 엉망입니다. –

0

이 상황에 대한 해결책 중 하나는 단색 배경색으로 그 사각형을 채우는 것입니다. 즉, 그 사각형 반지 안에 하나의 사각형을 만드십시오. 그 부분을 잘라냅니다.

+0

그 사각형이 투명해야하고, 그 아래에 객체가 나타날 것입니다. –