我正在實現動態視場。我決定使用着色器來使照明更好看,以及它如何影響牆壁。這是我工作的場景: http://i.imgur.com/QxZVyo7.jpg使用着色器在2D環境中實現視場
我有地圖,有平坦的地面和牆壁。這裏的每一件事都是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;
}
迭代每個frament只是去尋找紅色像素的面具看起來像一個巨大的過載,但我看不出如何完成這通過使用着色器以任何其他方式進行。
爲什麼你想使用着色器呢? – 2013-03-27 12:10:29
我正在使用的庫是SFML。我試圖弄清楚如何讀取圖像上的像素信息(以便將可見光像素上方的牆設置爲可見),但操作非常緩慢,並且應該對每個像素進行此過程,所以它不是真的可行。我遇到了着色器,並決定嘗試一下。我喜歡這個結果,但是我擔心表現並不好,但我對着色器完全陌生,所以我想聽聽其他人的意見。 – Leo 2013-03-27 12:14:04