Я пытаюсь создать генерацию карты на основе шума в openGL.
Но моя проблема - нормальный расчет.
Сначала я попробовал его в geometryShader, он работал, но он не был гладким, поэтому я попытался вычислить его в CPU.
Я видел какой-то пост (такой как: Вычисление нормалей из карты высот ) о том, как это сделать, поэтому после его реализации он вообще этого не делает
Я немного растерялся, понятия не имею, почему это не работает нормально.
Сетка поколения
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);
}
Генератор высоты работает нормально на поколении мира, поэтому я сомневаюсь, что это проблема.