我即将为我的游戏创建一个灯光系统,我实际上已经设置了它,但是在图像中看到了这种“块状”闪电。我想平滑脸部,以便两个不同的瓷砖不值得注意。
我已经查看了这个主题,我找到的唯一真正的答案是平均所有4个周围的邻居光并从中创建一个渐变。答案是found here,但没有特别的规则要遵循,因为这是我需要找到的。
每个图块的光强度是100-255之间的固定数字,其中100是最暗的,255是最亮的(不透明度),每个顶点都得到这个值。
我是否必须找出哪个邻居使用每个切片顶点并从那里继续?我真的没有头绪
我的灯光的当前版本如下所示:编辑:现在它看起来像这样。它有一些缺陷。
我试图收集所有邻居顶点并取其平均值(见下图)。通过遵循这种方法,我将在每个顶点上接收不同的强度值。
这是算法的开始。此功能旨在为灯光中的每个图块运行。从我目前的算法状态,我需要在同一点上找到顶点。 我被困在这里! :' - (我已经更新了算法,但它仍然有一些视觉缺陷。请注意,当其他人没有时,左上角和右下角是“块状”。如果你仔细观察中心,有六边形,~3宽和高。
void Torch::smoothLight(int pX, int pY)
{
if (pX == 0 || pX == (mWidth - 1) || pY == 0 || pY == (mHeight - 1)) return;
// Tile we are smoothing
Tile *c = mTilesInRange[pY * mWidth + pX];
if (c == nullptr) return;
int x_min_1 = pX - 1;
int x_plus_1 = pX + 1;
int y_min_1 = pY - 1;
int y_plus_1 = pY + 1;
// Get all nearby tiles in all 8 weather directions
Tile *NW = mTilesInRange[y_min_1 * mWidth + x_min_1];
Tile *N = mTilesInRange[y_min_1 * mWidth + pX];
Tile *NE = mTilesInRange[y_min_1 * mWidth + x_plus_1];
Tile *E = mTilesInRange[pY * mWidth + x_plus_1];
Tile *SW = mTilesInRange[y_plus_1 * mWidth + x_min_1];
Tile *S = mTilesInRange[y_plus_1 * mWidth + pX];
Tile *SE = mTilesInRange[y_plus_1 * mWidth + x_plus_1];
Tile *W = mTilesInRange[pY * mWidth + x_min_1];
/*
- Loop trough all 4 vertices on the tile in the following order
0 1
2 3
- For each vertex, find the 3 other vertices that lies on the same point, example vertex 1:
0 1 <--
2 3
0 1 0 1
2 3 2 3
Original quad -> 0 1 0 1
-> 2 3 2 3
Result: 3 2
1 0
*/
for (int i = 0; i < 4; i++)
{
int intensitySum = 0;
// This is really ugly but I can't come up with a better algorithm
if (i == 0) // upper left
{
intensitySum += c->getQuad()[0].color.a; // me
intensitySum += N->getQuad()[3].color.a;
intensitySum += NW->getQuad()[2].color.a;
intensitySum += W->getQuad()[1].color.a;
int alpha = intensitySum / 4;
c->getQuad()[0].color.a = alpha;
}
else if (i == 1) // upper right
{
intensitySum += c->getQuad()[1].color.a; // me
intensitySum += N->getQuad()[2].color.a;
intensitySum += NE->getQuad()[3].color.a;
intensitySum += E->getQuad()[0].color.a;
int alpha = intensitySum / 4;
c->getQuad()[1].color.a = alpha;
}
else if (i == 2) // lower left
{
intensitySum += c->getQuad()[2].color.a; // me
intensitySum += E->getQuad()[3].color.a;
intensitySum += SE->getQuad()[0].color.a;
intensitySum += S->getQuad()[1].color.a;
int alpha = intensitySum / 4;
c->getQuad()[2].color.a = alpha;
}
else if (i == 3) // lower right
{
intensitySum += c->getQuad()[3].color.a; // me
intensitySum += S->getQuad()[0].color.a;
intensitySum += SW->getQuad()[1].color.a;
intensitySum += W->getQuad()[2].color.a;
int alpha = intensitySum / 4;
c->getQuad()[3].color.a = alpha;
}
}
}