C++ - 浮点数组在某个非常大的索引之后不存储值
C++ - Float array not storing values after a certain very large index
在我的程序中,我正在使用柏林噪声创建地形。地形正在正确生成,现在我正在尝试将计算出的法线存储到称为法线的浮点数组中。它正确地将法线存储到某个索引,但随后它只存储 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。但是当我从数组中打印出法线(使用正确的索引(时,我只得到 0。
对于normals
数组,删除乘法与VALS_PER_VERT
。它将使您的阵列比需要的大三倍。
未初始化的元素的值取决于您定义数组的位置:如果它们被定义为全局(或命名空间(变量,它们将被初始化为零;如果它们在函数中被定义为局部变量,它们的值将是不确定的(读取它们将导致未定义的行为(。
所以定义应该是
float normals[ N*N*VERTICES_PER_QUAD ];
并记住不要越界。这将使所有元素在您显示的循环中初始化。
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- 在类定义之后定义一个私有方法
- 查找最接近的大于当前数字的数字的索引
- 在循环C++中指定字符串之后,不会打印该字符串
- 在C++中调整向量中的索引
- 重载元组索引运算符-C++
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 有没有一种简单的方法可以在C++中获取特定索引之后向量中的所有项目?
- C++ - 浮点数组在某个非常大的索引之后不存储值
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 分段错误发生在索引离开C++数组边界之后
- C++ 中 15000 数组索引之后的不相关整数标准输入
- 在数组中查找索引 给出它之前和之后的总和
- 结构数组索引 在第一个索引之后未填充
- 即使在将新字符串复制到现有字符串之后,旧包含也可用(在某些索引中)
- 通过*ptr1++之后的索引访问=*ptr2++