射线追踪中的BRDF和球坐标
我开发了使用标准Phong / Blinn Phong照明模型的光线跟踪器。现在,我正在对其进行修改以支持基于物理的渲染,因此我正在实现各种BRDF模型。目前,我专注于Oren-Nayar和Torrance-Sparrow模型。这些中的每一个均基于用于表示入射光和出射光方向的球坐标。 我的问题是:正确的方法是将wi和wo从笛卡尔坐标转换为球坐标? 我正在应用此处报告的标准公式https://en.wikipedia.org/wiki/Spherical_coordinate_system#Coordinate_system_conversions,但是我不确定自己做对了,因为我的向量的起点不是尾巴直角坐标系,但以射线与对象的交点为中心。 在这里您可以找到我当前的实现: https://github.com/chicio/Multispectral-Ray-tracing/tree/brdf/RayTracing/RayTracer/Objects/BRDF https://github.com/chicio/Multispectral-Ray-tracing/blob/brdf/RayTracing/RayTracer/Math/Vector3D.cpp 谁能帮我解释将wi和wo矢量从笛卡尔坐标转换为球坐标的正确方法吗? 更新 我在这里复制代码的相关部分: 球坐标计算 float Vector3D::sphericalTheta() const { float sphericalTheta = acosf(Utils::clamp(y, -1.f, 1.f)); return sphericalTheta; } float Vector3D::sphericalPhi() const { float phi = atan2f(z, x); return (phi < 0.f) ? phi + 2.f * M_PI : phi; } 奥伦·纳亚(Oren Nayar) …