1

基本的な照明を作成するためのレイ キャスティング システムを作成しました (デモのように動作するもの: 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 を提供するはずですが、代わりに次のような結果が得られます。 明らかに円のような形ではありません

なぜそれが機能するのかわかりません...

4

1 に答える 1