我目前正在用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,除了一个小方块。 它会渲染得很好,但是如果我移动背景,整个屏幕除了可见的方形变成黑色。
答案 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个方块以实现更精细的控制。