簡體   English   中英

在2d tilemap上渲染戰爭迷霧

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM