2015-02-05 6 views
0

Libgx 1.x Stage에서 내 목표는 원래 화면을 표시해야하는 영역을 제외하고 어두운 반투명 마스크를 화면에 적용하는 것입니다.렌더링()에서 Libgdx 블렌딩 대비 문제가 발생했습니다.

내 글로벌 렌더링 방법 : 객체 Darkener 및 스포트 라이트의

public void render() { 
    Gdx.gl.glClearColor(0, 0, 0, 1);   
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    batch.setShader(null); 
    update(); 
    stage.act(Gdx.graphics.getDeltaTime());  
    stage.draw();  

    batch.begin();  
    darkener.draw(batch, 0.7f);  
    spotlight.draw(batch, 1f);  
    batch.end();     
} 

두 인스턴스 순수한 흰색 4 × 4 텍스처로 만든 스프라이트 있습니다

spotlight = new Sprite(new Texture(Gdx.files.internal("data/ui/whitepixel.png"))); 

darkener = new Sprite(new Texture(Gdx.files.internal("data/ui/whitepixel.png"))); 

가 나는 줄 내 Darkener 화면의 크기를 객체 , 그리고 Spotlight 객체는 내가 어두워지기를 원치 않는 영역의 크기입니다. 를 매개 변수로 :

public void draw(Batch batch, float alpha) { 
    batch.setBlendFunction(GL20.GL_DST_COLOR, GL20.GL_SRC_ALPHA); 
    spotlight.draw(batch, alpha); 
    batch.setBlendFunction(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA); 
} 

내 문제가 혼합에 관한 것입니다 :

public void draw(Batch batch, float alpha) {   
    darkener.draw(batch, alpha);   
} 

그리고 내 스포트라이트 객체의 그리기 방법 : 여기

내 객체 darkener의 그리기 방법

darkener.draw(batch, 0.7f);  
spotlight.draw(batch, 1f); 

보존 된 (스포트라이트) 영역이 원본보다 어둡습니다. 파라미터와

다음 보존 (주목) 영역이 밝

darkener.draw(batch, 0.3f);  
spotlight.draw(batch, 1f); 

원본보다 (포화). paremeters와

: (내가 원하는, 그래서)

darkener.draw(batch, 0.5f);  
spotlight.draw(batch, 1f); 

보존 된 (스포트라이트) 영역은 원본과 똑같은입니다. 문제는 제 어둡게에 대해 다른 값을 설정할 수 있기를 원합니다. < 0.5f 또는> 0.5f입니다.

내가 뭘 잘못하고 있니?

답변

2

스포트라이트에 사용하는 혼합 기능은 현재 픽셀 밝기를 취해 (1 + alpha) 곱합니다.

밝기 0.7 (어둡게 알파 0.3 사용)으로 어두워지면 스포트라이트가 1/0.7 = 1.429만큼 밝기를 곱하기를 원하므로 스포트라이트 알파 0.429를 사용해야합니다. 그래서 : 미만 0.5 밝기 (darkner 알파> 0.5)에 어둡게 경우

spotlightAlpha = 1/(1-darkenerAlpha) - 1; //assuming darkener RGB is black 

문제는 알파가 1보다 클 수 없습니다 때문에 밝기가 될 때까지 반복 알파 1 스포트라이트를 실행해야 할 것입니다 0.5 이상 그리고 적절한 값으로 한 번 더.

이 방법은 적합하지 않을 수 있으므로 더 어두운 색 정밀도를 잃게됩니다. 대신 8 개의 어두운 상자를 그릴 수 있습니다. 스포트라이트가 사각형이 아니게하려면 스프라이트를 반전시켜 가운데 직사각형을 채 웁니다.

+0

안녕하세요 @ Tenfour04, 그리고 당신의 답변에 감사드립니다. 문제의 원인에 대해서는 분명히 맞습니다. 그러나 스포트라이트에 필요한 알파를 찾기위한 수식은 1/darkener alpha입니까?그것은 나에게 원하는 결과를 제공하지 않지만 darkener = 0.6, 0.7 등등에 대한 ok 결과를 찾았습니다. 또한 8 개의 어두운 상자를 그리기 위해 조금 더 자세히 설명해 주시겠습니까? 나는 바보 같지만 전혀 얻지 못했다! 시간과 좋은 아이디어를 주셔서 감사합니다 – Don

+0

나는 그것이 옳다고 생각하지만, 어떤 정보가 누락되었을 수 있습니다. 위에 설명 된 내용을 토대로 어두운 부분은 반투명 한 흰색 직사각형을 그리기 때문에 화면을 더 옅게 만듭니다. 네가 흑인이 된 것으로 추정하고 있었다. 그리고 실제로 나는 그 가정에 기초하여 그것을 뒤집어 놓았을 것이라고 생각합니다. 8 개의 어두운 상자 란 의미합니다. 스도쿠 격자 9 개를 상상해보십시오. 단, 화면에 맞게 늘리면 안쪽 선을 이동시켜 가운데 상자가 스포트라이트의 크기가되도록하십시오. 주변의 8 개 상자의 좌표에 어둡게를 그릴 수 있고 가운데 상자에 스포트라이트 스프라이트를 그릴 수 있습니다. – Tenfour04

+0

나는 나의 설명이 불분명하다는 것을 깨달았다. '0.7까지 어두워진다'는 것은 어둡게하는 스프라이트가 검은 색이라고 가정 할 때 0.3의 어둡게 알파를 사용하는 것과 같은 원래의 밝기의 70 %까지 어둡게한다는 의미입니다. 따라서 스포트라이트 알파의 공식은'1/(1-darkenerAlpha) - 1'. – Tenfour04