私はlibGDXに基づいた私のゲームで単純な2D光エンジンを実装しようとしています。アイデアは、シェーダなしでこのライトエンジンを作成することです。私は今のところ影を描こうとは考えていません。 私は、三角形や勾配を有する光マップをレンダリングするために管理しているが、問題は、複数の光源が重なった場合、私はこの写真のように、いくつかの人工物を得たことである:2D光拡散マップartif
黄色光源が暗く産れます他の光源と重なり合うときに境界を定める。
私はライトをレンダリングするために、次のブレンド機能を使用しています:
Gdx.gl.glBlendFunc(GL20.GL_ONE, GL20.GL_ONE);
は、この暗い国境を取り除く方法はありますか?
グラデーションは、黄色から黒色の完全な不透明度になります。 GL_ONE
は加法的であると考えられるので、色はより明るくなるはずですか?
アップデート1:シェーダを使用して
ニコSchertlerで説明したように確かに良いですが、私はわからないいくつかのパラメータが残っています。
ここで私は
void main() {
float intensity = 0.02;
vec2 pos = vPosition;
float dist = distance(pos, u_origin)/u_radius;
vec4 color = vec4(intensity * (vColor.rgb/((dist * dist) + 0.01)), 1);
gl_FragColor = color;
}
を思い付いたフラグメントシェーダは、問題は、定数についてわからないことIでintensity = 0.02
と0.01
され、私はそれは素晴らしい見えるようにする機能を追加しました。また、半径変数は画面の高さと幅の間の最大値になりました。
アップデート2:
私は最終的に次の式を選択している:
そして、オクルージョンマップと組み合わせvoid main() {
float dist = distance(vPosition, u_origin)/u_radius;
vec4 color = vec4((vColor.rgb)/(pow(dist, 2) + 0.01), vColor.a);
gl_FragColor = color;
}
(非照光場所を暗くする)同じ式に基づきます。
暗いバンドが幻想であること。あなたはどんなグラフィックスエディタでも値をチェックして、それらがより暗くないことを確認することができます:)現在、あなたはsRGBでレンダリングしていないようですが、そうすべきです。二次的なフォールオフのような他のものもおそらくそれを隠すでしょう。 – ybungalobill