Нормальный от высоты карты - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь создать генерацию карты на основе шума в openGL.

Но моя проблема - нормальный расчет.

Сначала я попробовал его в geometryShader, он работал, но он не был гладким, поэтому я попытался вычислить его в CPU.

Я видел какой-то пост (такой как: Вычисление нормалей из карты высот ) о том, как это сделать, поэтому после его реализации он вообще этого не делает

screenShot

Я немного растерялся, понятия не имею, почему это не работает нормально.

Сетка поколения


    int xTest = (x / (size_*2.0f)) * (len_);
    int zTest = (z / (size_*2.0f)) * (col_);

    float widthStep(2.0f / len), heightStep(2.0f / col);
    float widthTexStep(1.0f / len), heightTexStep(1.0f / col);

    for (size_t i(0); i < col; ++i) {
        for (size_t j(0); j < len; ++j) {

            float actualZ((i / (float)col)*2.0f - 1.0f), actualX((j / (float)len)*2.0f - 1.0f);
            float actualYTex(i / (float)col), actualXTex(j / (float)len);

            glm::vec2 pos1((int)j + xTest, (int)i + zTest), pos2((int)j + 1 + xTest, (int)i + zTest), pos3((int)j + xTest, (int)i + 1 + zTest), pos4((int)j + 1 + xTest, (int)i + 1 + zTest);

            float y1(heightGenerator_->generateHeight(pos1.x, pos1.y)), y2(heightGenerator_->generateHeight(pos2.x, pos2.y)), y3(heightGenerator_->generateHeight(pos3.x, pos3.y)), y4(heightGenerator_->generateHeight(pos4.x, pos4.y));


            //First Triangle
            //First Point
            //Position
            data_.push_back(actualX); //X
            data_.push_back(y1); //Y
            data_.push_back(actualZ); //Z
            heightMap_[i * (col + 1) + j] = y1;
            //Normal
            addNormal(pos1.x, pos1.y);

            //Texture
            data_.push_back(actualXTex); //TexX
            data_.push_back(actualYTex); //TexY


            //Second Point
            //Position
            data_.push_back(actualX + widthStep); //X
            data_.push_back(y2); //Y
            data_.push_back(actualZ); //Z

            //Normal
            addNormal(pos2.x, pos2.y);

            //Texture
            data_.push_back(actualXTex + widthTexStep); //TexX
            data_.push_back(actualYTex); //TexY


            //Thirdpoint
            //Position
            data_.push_back(actualX); //X
            data_.push_back(y3); //Y
            data_.push_back(actualZ + heightStep); //Z
            heightMap_[(i+1) * (col + 1) + j] = y3;

            //Normal
            addNormal(pos3.x, pos3.y);

            //Texture
            data_.push_back(actualXTex); //TexX
            data_.push_back(actualYTex + heightTexStep); //TexY


            //Second Triangle
            //FirstPoint
            //Position
            data_.push_back(actualX); //X
            data_.push_back(y3); //Y
            data_.push_back(actualZ + heightStep); //Z

            //Normal
            addNormal(pos3.x, pos3.y);

            //Texture
            data_.push_back(actualXTex); //TexX
            data_.push_back(actualYTex + heightTexStep); //TexY


            //Second Point
            //Position
            data_.push_back(actualX + widthStep); //X
            data_.push_back(y4); //Y
            data_.push_back(actualZ + heightStep); //Z
            heightMap_[(i + 1) * (col + 1) + j + 1] = y4; 

            //Normal
            addNormal(pos4.x, pos4.y);

            //Texture
            data_.push_back(actualXTex + widthTexStep); //TexX
            data_.push_back(actualYTex + heightTexStep); //TexY


            //Third point
            //Position
            data_.push_back(actualX + widthStep); //X
            data_.push_back(y2); //Y
            data_.push_back(actualZ); //Z
            heightMap_[i * (col + 1) + j + 1] = y2;

            //Normal
            addNormal(pos2.x, pos2.y);

            //Texture
            data_.push_back(actualXTex + widthTexStep); //TexX
            data_.push_back(actualYTex); //TexY
        }

    }

И функция addNormal:

void Terrain::addNormal(int x, int z) {
    float L(heightGenerator_->generateHeight(x - 1, z)), R(heightGenerator_->generateHeight(x + 1, z)), D(heightGenerator_->generateHeight(x, z - 1)), U(heightGenerator_->generateHeight(x, z + 1));
    glm::vec3 normal(glm::normalize(glm::vec3(L - R, 2.0f, D - U)));

    data_.push_back(normal.x);
    data_.push_back(normal.y);
    data_.push_back(normal.z);

}

Генератор высоты работает нормально на поколении мира, поэтому я сомневаюсь, что это проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...