我正在用C++编写一个物理模拟器,我担心的是健壮性.我已经读过,当计算两个几乎相等的数量的差值时,浮点运算会发生灾难性的消除.我想到,当计算两个几乎正交矢量的点积时,这可能发生在模拟器中.但是,我所看到的参考文献仅讨论通过重写相关方程来解决问题(例如,可以重写二次公式以消除问题) - 但这在计算点积时似乎不适用?我想我有兴趣知道这是否是物理引擎中的一个问题,以及它是如何解决的.
我一直在查看 Kevin Beason 的路径跟踪器“smallpt”(http://www.kevinbeason.com/smallpt/),并有一个关于镜面反射计算的问题(第 62 行)。
我对渲染方程(http://en.wikipedia.org/wiki/Rendering_equation)的理解是,要计算差分区域的出射辐射,您需要对差分区域上方半球中每个差分立体角的入射辐射进行积分,由 BRDF 和余弦因子加权,余弦因子的目的是减少对以更多掠射角入射光降落在该区域的差分辐照度的贡献(因为这些角度的光将传播到更大的区域,这意味着所讨论的差异区域将接收更少的这种光)。
但是在 smallpt 代码中,这个余弦因子不是第 62 行镜像反射计算的一部分。(它也从漫反射计算中省略,但我相信这是因为漫射光线是用余弦加权重要性采样选择的,这意味着不需要显式乘以余弦因子)。
我的问题是为什么镜面反射计算不需要余弦因子?如果入射辐照度相同,但入射角变得更加掠过,那么无论是考虑漫反射还是镜面反射,落在差分区域的辐照度都不会降低吗?
使用C++ lambdas,当您通过引用捕获引用时会发生什么?您是在捕获对堆栈上的本地对象(引用本身)的引用,还是对引用的对象的引用?例如,在以下代码中:
int& TestClass::returnReference()
{
static int i=0;
return i;
}
std::function<void ()> TestClass::testFunction()
{
int& memberRef = this->someIntMember;
int& intRef = returnReference();
auto lambda =
[&]
{
// What happens when you capture a reference by reference
// like memberRef or intRef?
};
return lambda;
}
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,为什么std::function<void (X)>允许绑定到函数void f(X&&)?
#include <functional>
struct X {};
void f1(X x) {}
void f2(X& x) {}
void f3(const X&) {}
void f4(X&& x) {}
int main()
{
X x;
f1(x); // ok
f2(x); // ok
f3(x); // ok
// f4(x); // doesn't compile
std::function<void (X)> ff1(f1); // ok
//std::function<void (X)> ff2(f2); // doesn't compile
std::function<void (X)> ff3(f3); // ok
std::function<void (X)> ff4(f4); // ok... why?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么允许这样做背后的直觉是std::function什么,它将如何由 实现,以及当您将左值参数传递给std::function,然后调用接受右值引用的函数时,这实际上意味着什么?
以下是否定义了行为?
uint32_t* p = new uint32_t();
char* p2 = reinterpret_cast<char*>(p);
delete p2;
Run Code Online (Sandbox Code Playgroud)
(是否有与之相关的标准报价?)
我知道存在其他选择,但我只是对这一个感到好奇.
谢谢!
c++ ×4
graphics ×1
lambda ×1
math ×1
montecarlo ×1
physics ×1
raytracing ×1
reference ×1
reflection ×1
rendering ×1
std-function ×1