我正在使用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;
}
我可以通过以下配置获得正确的结果:
但是,缓冲区是所有零向量,释放(优化= \ O1或\ O2或\ Ox),x64 ,我得到的是黑色图片。
因此,使用 Release(optimization = \ O1或\ O2或\ Ox),x64 ,我取消注释输出部分以检查缓冲区中的值。奇怪的是,我检查的每个像素都有一个正确的值,那些未检查的像素仍然是零矢量。例如,如果我像上面的代码一样检查每16个像素,我将得到这样的图片(每16个像素256 * 256黑色镶嵌):
我用谷歌搜索并阅读了一些像Surviving the Release Version这样的材料,但仍然不知道。任何人都可以提供一些处理这些问题的经验吗?
更新:上面的代码不是那么详细,完整代码是here,取决于Eigen 3.2.6。
答案 0 :(得分:2)
在完成Ideone上的代码后,问题似乎如下。在Scene
类中,intersect
方法返回bool const &
。返回的引用是局部变量。如果您检查了您已经看到的错误/警告日志:
警告2警告C4172:返回本地变量的地址或临时***。cpp 129 1
将返回类型更改为bool
可以解决问题,输出类似于32位版本的输出。