在2d tilemap上渲染Fog-Of-War-War

时间:2015-06-17 10:35:40

标签: java opengl 2d lwjgl

我目前正在用lwjgl创建一个小型的2D游戏 我试图想出一种实施战争迷雾的方法 我使用黑色背景,alpha设置为0.5 然后我添加了一个Square,将每个图块的alpha设置为1,然后点亮,最后得到一个带有不同Alpha值的黑色背景。

然后我使用blendfunction渲染了我的背景:

glBlendFunc(GL_ZERO, GL_SRC_ALPHA)

这很有效,但现在我在添加第二层透明部件时遇到了问题,并对它们应用了Fog-Of-War。

我已经阅读了一些关于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,除了一个小方块。 它会渲染得很好,但是如果我移动背景,整个屏幕除了可见的方形变成黑色。

1 个答案:

答案 0 :(得分:0)

一种方法是最后渲染Fog-of-War图层,使用在渲染后在所有其他图层的顶部渲染的无纹理黑色正方形。

使用此混合功能:

glBlendFunc(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA)

并设置每个顶点的Fog-of-War alpha,以便当它为1.0时,黑色叠加层是透明的,而当它为0.0时,它是完全黑色的。 (如果你希望alpha具有相反的含义,只需交换参数)。

为了使其更加平滑,您可以在方块的每个角上设置每个顶点的alpha,以便在其上平滑变化。您还可以使用具有不同alpha值的纹理而不是纯黑色方块,或将该方块细分为4或16个方块以实现更精细的控制。