libGDXのShapeRendererで描画する際にアルファブレンディングが効かなくてハマりました。
マゼンタの四角形を描画していますが、左側の四角形はアルファが効いていません。
右は意図通り50%アルファが効いています。
ソース
ソースは以下のとおりです。
左側(アルファ効いてない)
left
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
renderer.begin(ShapeType.Filled);
renderer.setColor(1, 0, 1, 0.5f);
renderer.rect(50, 50, 300, 300);
Gdx.gl.glDisable(GL20.GL_BLEND);
renderer.end();
右側(アルファ効いてる)
right
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
renderer.begin(ShapeType.Filled);
renderer.setColor(1, 0, 1, 0.5f);
renderer.rect(450, 50, 300, 300);
renderer.end();
Gdx.gl.glDisable(GL20.GL_BLEND);
原因
アルファが効いていないほうは、 game_.renderer.end();
を呼ぶ前に、Gdx.gl.glDisable(GL20.GL_BLEND);
でアルファブレンディングを無効にしてしまっていました。
間抜けすぎるー
game_.renderer.end();
が呼ばれた時点で実際に描画がまとめて実行されるので、その前にアルファ無効化しちゃダメってことですね。
OpenGLの気持ちになって考えればすぐわかることだった…。
そういう理屈なので以下のように書いてもアルファは効きます。
※解りづらいのでオススメはしない。
AlphaOk
renderer.begin(ShapeType.Filled);
renderer.setColor(1, 0, 1, 0.5f);
renderer.rect(450, 50, 300, 300);
Gdx.gl.glEnable(GL20.GL_BLEND);
Gdx.gl.glBlendFunc(GL20.GL_SRC_ALPHA, GL20.GL_ONE_MINUS_SRC_ALPHA);
renderer.end();
Gdx.gl.glDisable(GL20.GL_BLEND);