我正在实现动态视野。我决定使用着色器以使照明更好看以及它如何影响墙壁。这是我正在处理的场景: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;
}
迭代每个帧只是为了寻找掩码中的红色像素似乎是一个巨大的过载,但我看不到如何通过使用着色器以任何其他方式完成此任务。