В моей программе я создаю ландшафт, используя шум Perlin.Ландшафт генерируется правильно, и теперь я пытаюсь сохранить вычисленные нормали в массиве с плавающей точкой, который называется normals .Он правильно сохраняет нормали до определенного индекса, но затем просто хранит 0.Вот мой код:
float frequency = 8;
float flagVertices[ N*N*VALS_PER_VERT*VERTICES_PER_QUAD ];
float normals[ N*N*VALS_PER_VERT*VERTICES_PER_QUAD ];
int idxFlag = 0;
int normFlag = 0;
for (int i=0;i < N;i++){
for (int j=0;j < N;j++){
// *** Face 1 ***
// (0,0)
flagVertices[idxFlag++] = (float)i/N;
flagVertices[idxFlag++] = 0.2f*PerlinNoise( glm::vec2( (float)i/N*frequency, (float)j/N*frequency ) );
flagVertices[idxFlag++] = (float)j/N;
glm::vec3 p0 = glm::vec3(flagVertices[idxFlag-3], flagVertices[idxFlag-2], flagVertices[idxFlag-1]);
// (0,1)
flagVertices[idxFlag++] = (float)i/N;
flagVertices[idxFlag++] = 0.2f*PerlinNoise( glm::vec2( (float)i/N*frequency, (float)(j+1)/N*frequency ) );
flagVertices[idxFlag++] = (float)(j+1)/N;
glm::vec3 p1 = glm::vec3(flagVertices[idxFlag-3], flagVertices[idxFlag-2], flagVertices[idxFlag-1]);
// (1,1)
flagVertices[idxFlag++] = (float)(i+1)/N;
flagVertices[idxFlag++] = 0.2f*PerlinNoise( glm::vec2( (float)(i+1)/N*frequency, (float)(j+1)/N*frequency ) );
flagVertices[idxFlag++] = (float)(j+1)/N;
glm::vec3 p2 = glm::vec3(flagVertices[idxFlag-3], flagVertices[idxFlag-2], flagVertices[idxFlag-1]);
// Adding in normals
glm::vec3 normal = glm::abs(glm::triangleNormal(p0,p1,p2));
normals[normFlag++] = normal.x;
normals[normFlag++] = normal.y;
normals[normFlag++] = normal.z;
// *** Face 2 ***
// (1,1)
flagVertices[idxFlag++] = (float)(i+1)/N;
flagVertices[idxFlag++] = 0.2f*PerlinNoise( glm::vec2( (float)(i+1)/N*frequency, (float)(j+1)/N*frequency ) );
flagVertices[idxFlag++] = (float)(j+1)/N;
glm::vec3 p3 = glm::vec3(flagVertices[idxFlag-3], flagVertices[idxFlag-2], flagVertices[idxFlag-1]);
// (1,0)
flagVertices[idxFlag++] = (float)(i+1)/N;
flagVertices[idxFlag++] = 0.2f*PerlinNoise( glm::vec2( (float)(i+1)/N*frequency, (float)j/N*frequency ) );
flagVertices[idxFlag++] = (float)j/N;
glm::vec3 p4 = glm::vec3(flagVertices[idxFlag-3], flagVertices[idxFlag-2], flagVertices[idxFlag-1]);
// (0,0)
flagVertices[idxFlag++] = (float)i/N;
flagVertices[idxFlag++] = 0.2f*PerlinNoise( glm::vec2( (float)i/N*frequency, (float)j/N*frequency ) );
flagVertices[idxFlag++] = (float)j/N;
glm::vec3 p5 = glm::vec3(flagVertices[idxFlag-3], flagVertices[idxFlag-2], flagVertices[idxFlag-1]);
// Adding in normals
normal = glm::abs(glm::triangleNormal(p3,p4,p5));
normals[normFlag++] = normal.x;
normals[normFlag++] = normal.y;
normals[normFlag++] = normal.z;
}
}
Я уверен, что это проблема C ++, которая у меня возникла, потому что я пытался распечатать нормали сразу после того, как она была создана, и я не вижу нулей.Но когда я печатаю нормали из массива (с правильным индексом), я просто получаю 0.