動的視野を実装しています。照明の見栄えを良くし、壁にどのように影響するかを確認するために、シェーダーを使用することにしました。これが私が取り組んでいるシナリオです:http: //i.imgur.com/QxZVyo7.jpg
私は平らな床と壁の地図を持っています。ここにあるものはすべて2Dであり、3Dジオメトリはなく、壁を構成する2Dポリゴンのみがあります。
ポリゴンの頂点を使用して影を落とし、表示可能な領域を定義します。(紫色の線は、次のステップで使用するマスクの一部です)
シナリオの上に影を描くときにシェーダーを使用して、壁も隠されないようにします。
このようにして、視野が変化するにつれて、影が壁に沿って動的に投影されます
これを実現するために、次のシェーダーを使用しました。しかし、これは一種のやり過ぎであり、本当に非効率的だと思います。
uniform sampler2D texture;
uniform sampler2D filterTexture;
uniform vec2 textureSize;
uniform float cellSize;
uniform sampler2D shadowTexture;
void main()
{
vec2 position;
vec4 filterPixel;
vec4 shadowPixel;
vec4 pixel = texture2D(texture, gl_TexCoord[0].xy );
for( float i=0 ; i<=cellSize*2 ; i++)
{
position = gl_TexCoord[0].xy;
position.y = position.y - (i/textureSize.y);
filterPixel = texture2D( filterTexture, position );
position.y = position.y - (1/textureSize.y);
shadowPixel = texture2D( texture, position );
if (shadowPixel == 0){
if( filterPixel.r == 1.0 )
{
if( filterPixel.b == 1.0 ){
pixel.a = 0;
break;
}
else if( i<=cellSize )
{
pixel.a = 0;
break;
}
}
}
}
gl_FragColor = pixel;
}
マスク内の赤い色のピクセルを探すためだけに各フレーマーを繰り返すことは、非常に過負荷のように見えますが、シェーダーを使用して他の方法でこのタックを完了する方法がわかりません。