C ++ - массив с плавающей точкой, не сохраняющий значения после определенного очень большого индекса - PullRequest
0 голосов
/ 31 мая 2018

В моей программе я создаю ландшафт, используя шум 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.

1 Ответ

0 голосов
/ 31 мая 2018

Для массива normals отбросьте умножение на VALS_PER_VERT.Это сделает ваш массив в три раза больше, чем нужно.

Значения элементов, которые вы не инициализируете, зависят от того, где вы определяете массивы: если они определены как глобальные (или пространства имен) переменныеони будут инициализированы как ноль;Если они определены как локальные переменные внутри функции, их значения будут неопределенными (и чтение их приведет к неопределенному поведению ).

Таким образом, определение должно быть

float normals[ N*N*VERTICES_PER_QUAD ];

и не забывайте выходить за его пределы.Это сделает все элементы инициализированными внутри отображаемого цикла.

...