基本的な照明を作成するためのレイ キャスティング システムを作成しました (デモのように動作するもの: http://www.redblobgames.com/articles/visibility/ )。それは私が望んでいたように機能しますが、ライトアップされた領域の各頂点にプレーヤー/光源からの距離を設定すると、補間が非常に悪くなり、たとえば、光/影を X の距離にトリムしたい場合、得られません円ですが、円と多角形/正方形の間のように見えます。写真で説明する必要があります。
また、それが重要な場合は、トップダウン カメラを使用した 3D プロジェクト (ゲーム) に使用します。(下の写真を参照)。アルゴリズムは、シェーダー自体を操作しなくてもうまく機能しますが、その上にプレーン スペースを描画します。(切り抜き等はありません)
ここに私の頂点シェーダーがあります:
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace; //vertex's position
layout(location = 1) in vec3 Normal; //normal, currently not used, but added for future
layout(location = 2) in vec2 vertexUV; //texture coords, used and works ok
out vec2 UV; //here i send tex coords
out float intensity; //and this is distance from light source to current vertex (its meant to be interpolated to FS)
uniform mat4 MVP; //mvp matrix
uniform vec2 light_pos; //light-source's position in 2d
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
UV = vertexUV;
intensity = distance(light_pos, vertexPosition_modelspace.xz); //distance between two vectors
}
そして、ここに私のフラグメントシェーダーがあります:
#version 330 core
in vec2 UV; //tex coords
in float intensity; //distance from light source
out vec4 color; //output
uniform sampler2D myTextureSampler; //texture
uniform float Opacity; //opacity of layer, used and works as expected (though to be change in near future)
void main() {
color = texture( myTextureSampler, UV );
color.rgba = vec4(0.0, 0.0, 0.0, 0.5);
if(intensity > 5)
color.a = 0;
else
color.a = 0.5;
}
このコードは、円で切り取られた素敵な FOV を提供するはずですが、代わりに次のような結果が得られます。
なぜそれが機能するのかわかりません...