基于Vulkan的反向拜占庭投影矩阵实现问题求助
反向/拜占庭投影矩阵实现问题
背景与尝试
我尝试实现反向/拜占庭投影来渲染物体,过程中既查找现成公式也尝试自行推导。
参考资料与初始实现
我找到一份关于反向拜占庭透视投影矩阵的资料,但其数学推导较为晦涩,未完全理解。基于这份资料,我写出了硬编码的投影函数(注释部分为常规透视投影代码):
fn perspective(fov : Float, aspect : Float, z_near : Float, z_far : Float) -> Mat4 { // debug_assert!(aspect > Float::MIN_POSITIVE, ""); // let tan_half_fovy = Float::tan(fov / 2.0); // let mut result = Mat4::zeros(); // result[(0, 0)] = 1.0 / (aspect * tan_half_fovy); // result[(1, 1)] = 1.0 / (tan_half_fovy); // result[(2, 2)] = -(z_far + z_near) / (z_far - z_near); // result[(2, 3)] = -(2.0 * z_far * z_near) / (z_far - z_near); // result[(3, 2)] = -1.0; // return result; let mut result = Mat4::zeros(); result[(0, 0)] = 2.0 / 800.0; result[(1, 1)] = 2.0 / 800.0; result[(2, 2)] = 2.0 / (z_far - z_near); result[(2, 3)] = -(z_far + z_near) / (z_far - z_near); result[(3, 2)] = 2.0 / (z_near - z_far); result[(3, 3)] = (z_far + z_near) / (z_near - z_far); return result; }
遇到的问题
该函数无法正常工作,渲染时无任何内容,所有物体疑似被裁剪。经RenderDoc验证,投影后无可见多边形。
自行推导进展
我尝试自行推导投影矩阵,目前推导至以下步骤:
其中n、f为远、近裁剪面距离,w、h为屏幕宽高。
上述推导的是正交投影矩阵,可将z值映射到[0,1]范围。常规透视投影矩阵会将最终结果的w分量设为-z,通过齐次坐标的隐式除法使物体越远越小;但我需要相反效果——让物体越远越大,这需要将坐标设为1/z来实现放大,这似乎无法仅靠矩阵运算完成,但我认为反向相机应该可以用矩阵表示。
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

