作业3中,bump shader和displacement shader中 注释提供的计算方式计算出来的t和n不是垂直的。pbrt中提到了如何快速的根据一个单位向量构建局部坐标系: 法向量n去掉一个坐标,交换另外两个坐标并任意一个坐标取负并单位化得到t轴,叉乘得到n轴。
代码如下
` auto n = normal.normalized();
float x = n.x();
float y = n.y();
float z = n.z();
Eigen::Vector3f t;
if(x > y)
{
t= Eigen::Vector3f(-z,0,x)/std::sqrt(x*x + z*z);
}
else
{
t = Eigen::Vector3f(0,-z,y)/std::sqrt(y*y + z*z);
}
Vector3f b = n.cross(t);`
第一个附件是作业里的代码,第二个是修改后的代码(差别不是很大
Attachments:
You must be
logged in to view attached files.