[英]Different result when Release x64 configuration in VS2015
我正在使用VS2015社区实现光线跟踪程序。 程序将填充屏幕尺寸的颜色缓冲区( width * height
,元素类型为Eigen::Vector3f
),然后将缓冲区内容保存到ppm文件中。
基本循环(请注意外部循环末尾的输出部分):
using Vec3f = Eigen::Vector3f;
Vec3f * buffer = new Vec3f[w * h];
// for each pixel
for (int y = 0; y < h; y++) for (int x = 0; x < w; x++)
{
int const i = (h - y - 1) * w + x;
buffer[i] = Vec3f::Zero();
// 2x2 subpixel
for (int sy = 0; sy < 2; sy++) for (int sx = 0; sx < 2; sx++)
{
Vec3f r = Vec3f::Zero();
// sampling
for (int s = 0; s < samps; s++)
{
// do some computation and accumulation to r
// r = ...
}
buffer[i] = buffer[i] + r;
}
buffer[i] = buffer[i] * 0.25f;
// debug with an output section
//if (x % 16 == 0 && y % 16 == 0)
// std::cout << buffer[i] << std::endl;
}
我可以通过以下配置获得正确的结果:
但是,缓冲区都是带有Release(优化= \\ O1或\\ O2或\\ Ox),x64的零向量,而我得到的是黑色图片。
因此,使用Release(优化= \\ O1或\\ O2或\\ Ox)x64 ,我取消了对输出部分的注释,以检查缓冲区中的值。 奇怪的是,我检查的每个像素都有一个正确的值,未检查的像素仍然是零向量。 例如,如果我像上面的代码那样每16个像素检查一次,就会得到这样的图片(每16个像素细分256 * 256黑色):
我在Google上搜索并阅读了《 生存版本》等一些资料,但仍然不知道。 谁能提供一些解决这些问题的经验?
更新 :上面的代码不是很详细,完整的代码在这里 ,取决于Eigen 3.2.6。
浏览完Ideone上的代码后,问题似乎如下。 在Scene
类中, intersect
方法返回bool const &
。 返回的引用是局部变量。 如果查看错误/警告日志,您将看到:
警告2警告C4172:返回本地变量或临时***。cpp的地址129 1
将返回类型更改为bool
解决此问题,并且输出类似于32位版本的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.