2014-02-06 3 views
1

저는 Libgdx를 사용하고 있습니다. 내 게임에서 pixmap을 사용하여 안개를 시뮬레이트하고 싶지만 "fogless" 서클을 생성하는 동안 문제가 있습니다. 먼저 검정으로 채워진 픽스맵을 만듭니다 (조금 투명합니다). 채우고 난 후에 그 위에 채워진 원을 그리기를 원하지만 그 결과는 내가 기대했던 것이 아니다. 나는 형식을 사용하는 경우 절차에 libgdx에서 채워진 원 및 픽스맵 사용

this.pixmap = new Pixmap(640, 640, Format.LuminanceAlpha); 
Pixmap.setBlending(Blending.None); // disable Blending 
this.pixmap.setColor(0, 0, 0, 0.9f); 
this.pixmap.fill(); 
//this.pixmap.setColor(0, 0, 0, 0); 
this.pixmap.fillCircle(200, 200, 100); 
this.pixmapTexture = new Texture(pixmap, Format.LuminanceAlpha, false); 

는()

public void render() { 
    mapRenderer.render(); 
    batch.begin(); 
    batch.draw(pixmapTexture, 0, 0); 
    batch.end(); 
} 

렌더링 . Pixmap과 Texture를 만들 때 알파는 더 반투명의 원을 보지 않습니다.

enter image description here

Problem

누군가가 나를 도울 수 : 여기

내 문제입니까? 무엇을해야합니까? 투명 원형 전체를 그리기 전에 무엇을 초기화해야합니까? 감사.

업데이트 내 문제에 대한 답변을 찾았습니다. 문제를 피하려면 블렌딩을 비활성화해야합니다.


이제 내 코드 :

FrameBuffer fbo = new FrameBuffer(Format.RGBA8888, 620, 620, false); 
Texture tex = EnemyOnRadar.assetManager.get("data/sugar.png", Texture.class); 

batch.begin(); 
// others 
batch.end(); 

fbo.begin(); 
batch.setColor(1,1,1,0.7f); 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
batch.begin(); 
batch.draw(tex, 100, 100); 
batch.end(); 
fbo.end(); 

하지만 (이, PNG 이미지의 투명 BG, 흰색 채워진 원을 나타냄) 원을 볼 수 없습니다.

+0

를 작동하는지 말해. 추가 질문이있는 경우 답변을 게시하는 대신이 질문을 업데이트하십시오. 당신이 코드를 시도해도 작동하지만 작동하지 않는다면, 코드를 붙여넣고 결과가 무엇인지 알려주세요. 그래서 나는 다른 사람들이 너를 도울 수있다. 감사합니다 – Springrbua

+0

다른 링크 : http://stackoverflow.com/questions/14729961/ambiguous-results-with-frame-buffers-in-libgdx – Springrbua

+0

어떻게 지금하고 있니? 블렌딩이 비활성화 된 상태에서 PixMap을 사용하고 있습니까? 아니면 내가 제안한 FBO 솔루션을 사용하고 있습니까? – Springrbua

답변

2

나는이 당신을 위해 작동하는 경우 확실하지 오전하지만 난 그냥 공유 : 당신은 FrameBuffer의를 사용하여 다음 작업을 수행 할 수 있습니다 :

  1. 당신이 화면에 그릴 원하는 모든 것을 그립니다.
  2. SpriteBatch를 끝내고 FrameBuffer를 시작한 후 SpriteBatch을 다시 시작하십시오.
  3. 전체 "화면"(FrameBuffer)을 검은 색이 아닌 투명한 색으로 채우는 안개를 그립니다.
  4. 안개를 삭제하려는 위치에 "Fogless"원을 흰색 원으로 그립니다.
  5. FrameBuffer 알파 채널 (투명도)을 0.7 또는 이와 비슷한 값으로 설정하십시오.
  6. SpriteBatchFrameBuffer을 끝내면 화면에 그려집니다.

어떻게됩니까? 안개가없는 일반 장면을 그립니다. "가상 화면"을 만들고 검정색으로 채우고 검정색을 흰색 원으로 과도하게 만듭니다. 이제이 "가상 스크린"에 투명성을 설정하고 실제 화면을 오버 스크린합니다. 흰색 원 아래에있는 화면 부분은 밝아 보이고 검은 색 나머지는 화면을 어둡게 만듭니다. 읽을 거리 : 2D Fire effect with libgdx, 안개와 다소 비슷합니다. 이것에 내 질문 : Libgdx lighting without box2d

편집 : 다른 Tutorial.

도움이되는지 알려주세요.

편집 : 일부 의사 코드 : 에서 생성 :

fbo = new FrameBuffer(Format.RGBA8888, width, height, false); 

에서 렌더링 :

fbo.begin(); 
glClearColor(0f, 0f, 0f, 1f); // Set the clear color to black, non transparent 
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Clear the "virtual screen" with the clear color 
spriteBatch.begin(); // Start the SpriteBatch 
// Draw the filled circles somehow // Draw your Circle Texture as a white, not transparent Texture 
spriteBatch.end(); // End the spritebatch 
fbo.end(); // End the FrameBuffer 
spriteBatch.begin(); // start the spriteBatch, which now draws to the real screen 
// draw your textures, sprites, whatever 
spriteBatch.setColor(1f, 1f, 1f, 0.7f); // Sets a global alpha to the SpriteBatch, maybe it applies alo to the stuff you have allready drawn. If so just call spriteBatch.end() before and than spriteBatch.begin() again. 
spriteBatch.draw(fbo, 0, 0); // draws the FBO to the screen. 
spriteBatch.end(); 

그것이 내가 내 대답은 그것을 확인 업데이트

+0

FrameBuffer에 그리는 방법을 예제 코드로 작성할 수 있습니까? 나는 전에 그것을 사용한 적이 없다. Btw, PixMap을 잊어 버리시겠습니까? – user2498846

+0

사실 나는 FrameBuffer를 사용하지 않았기 때문에 내가 새롭다고도 말해야 만합니다. 그러나 많은 자습서를 읽었습니다 : P 나는 내 대답을 업데이트합니다! pixmap을 사용하여 가능한지 모르겠습니다 ... 다른 누군가가 당신을 위해 조언을 얻길 바랍니다. – Springrbua

+0

그것은 작동하지 않습니다. 사실 그것이 작동하고 2 개 이상의 원이 있고 서로 겹치면 알파가 합산됩니다. 그래서 나는 잘 모릅니다. 어떻게해야합니까? – user2498846