[英]Render Fog-Of-War on 2d tilemap
我目前正在使用lwjgl創建一個小型2D游戲。
我試圖找出一種實現戰爭迷霧的方法。
我使用的黑色背景的Alpha設置為0.5。
然后,我添加了一個Square,將每個平鋪的Alpha設置為1,然后將其點亮,最后得到帶有不同Alpha值的黑色背景。
然后我使用blend功能渲染了我的背景:
glBlendFunc(GL_ZERO, GL_SRC_ALPHA)
這很好用,但是現在我遇到了一個問題,那就是添加帶有透明零件的第二層並將戰爭迷霧應用到它們上。
我已經讀過一些關於FrameBufferObjects的內容,但是我不知道如何使用它們以及它們是否是正確的選擇。
稍后,我想用紋理/圖像照亮瓷磚以使其看起來更平滑。 因此,這些紋理可能會重疊。 這就是為什么我選擇首先渲染戰爭迷霧的原因。
您有解決此問題的想法嗎?
感謝samgak。
現在,我嘗試在每個暗磚上渲染一個暗正方形,除了亮磚。 我將每個圖塊划分為8x8網格以獲取更多詳細信息。 這是我的方法:
public static void drawFog() {
int width = map.getTileWidth()>>3; //Divide by 8
int height = map.getTileHeight()>>3;
int mapWidth = map.getWidth() << 3;
int mapHeight = map.getHeight() << 3;
//background_x/y is the position of the background in pixel
int mapStartX = (int) Math.floor(background_x / width);
int mapStartY = (int) Math.floor(background_y / height);
//Multiply each color component with 0.5 to get a darker look
glBlendFunc(GL_ZERO, GL_SRC_ALPHA);
glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
glBegin(GL_QUADS);
//RENDERED_TILES_X/Y is the amount of tiles to fill the screen
for(int x = mapStartX; x < (RENDERED_TILES_X<<3) + mapStartX
&& x < mapWidth; x++){
for(int y = mapStartY; y < (RENDERED_TILES_Y<<3) + mapStartY
&& y < mapHeight; y++){
//visible is an boolean-array for each subtile
if(!visible[x][y]){
float tx = (x * width) - background_x;
float ty = (y * height) - background_y;
glVertex2f(tx, ty);
glVertex2f(tx+width, ty);
glVertex2f(tx+width, ty+height);
glVertex2f(tx, ty+height);
}
}
}
glEnd();
}
我將可見數組設置為false,除了一個小正方形。 它將很好地呈現,但是如果我移動背景,則整個屏幕(除了可見的正方形以外)都會變成黑色。
一種方法是最后渲染戰爭霧層,在渲染所有其他層之后,在所有其他層的頂部使用未紋理的黑色正方形進行渲染。
使用此混合功能:
glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA)
並設置戰爭迷霧Al-per-vertex,以使當它為1.0時,黑色疊加層是透明的;而當它為0.0時,則完全變為黑色。 (如果您希望Alpha具有相反的含義,只需交換參數即可)。
為了使其更加平滑,您可以在正方形的每個角上將每個頂點的alpha設置為在整個正方形上平滑變化。 您也可以使用具有不同alpha值的紋理代替純黑色正方形,或將正方形細分為4或16個正方形,以實現更好的控制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.