在Minecraft中看到的光滑闪电

时间:2014-06-24 17:48:09

标签: algorithm interpolation light

我即将为我的游戏创建一个灯光系统,我实际上已经设置了它,但是在图像中看到了这种“块状”闪电。我想平滑脸部,以便两个不同的瓷砖不值得注意。

我已经查看了这个主题,我找到的唯一真正的答案是平均所有4个周围的邻居光并从中创建一个渐变。答案是found here,但没有特别的规则要遵循,因为这是我需要找到的。

每个图块的光强度是100-255之间的固定数字,其中100是最暗的,255是最亮的(不透明度),每个顶点都得到这个值。

我是否必须找出哪个邻居使用每个切片顶点并从那里继续?我真的没有头绪

我的灯光的当前版本如下所示:编辑:现在它看起来像这样。它有一些缺陷。 enter image description here

我试图收集所有邻居顶点并取其平均值(见下图)。通过遵循这种方法,我将在每个顶点上接收不同的强度值。

enter image description here

这是算法的开始。此功能旨在为灯光中的每个图块运行。从我目前的算法状态,我需要在同一点上找到顶点。 我被困在这里! :' - (我已经更新了算法,但它仍然有一些视觉缺陷。请注意,当其他人没有时,左上角和右下角是“块状”。如果你仔细观察中心,有六边形,~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;
        }
    }
}

0 个答案:

没有答案