osgFBO(16),透视投影下的qedl

文章讨论了在透视模式下,由于摄像机位置改变导致的远近切面变化,需要进行深度补偿。floatfixDepth函数用于修正深度缓冲区的转换,确保深度值在0和1之间。同时,当摄像机位姿变动时,通过osg::Camera获取新的近远切面(zNear,zFar),并更新shader中的值以保持渲染的准确性。
摘要由CSDN通过智能技术生成

前面介绍了正交投影下的qedl,实际上,还有透视模式,根据摄像机位置的移动,远近切面也在不断变化,所以需要深度补偿。

float fixDepth(float depth)
{
if (PerspectiveMode == 1)
{
//‘1/z’ depth-buffer transformation correction
depth = (2.0 * ZM * Zm) / ((ZM + Zm) - (2.0 * depth - 1.0) * (ZM - Zm));
//eventually we want the depth to fall between 0 and 1
depth = (depth - Zm) / (ZM - Zm);
}

return clamp(1.0 - depth, 0.0, 1.0);

}

远近切面是从下式计算。只要摄像机位姿发生变动,就调用一次。
osg::ref_ptrosg::Camera camera = view->getCamera();
double fovy, aspect, zNear, zFar;
camera->getProjectionMatrixAsPerspective(fovy, aspect, zNear, zFar);
同时更新shader的值

void ccEDL::setNearPlane(float zNear)
{
_zNear = zNear;
_zNearUniform->set(_zNear);
}

void ccEDL::setFarPlane(float zFar)
{
_zFar = zFar;
_zFarUniform->set(_zFar);

}
_zNearUniform = new osg::Uniform(“Zm”, _zNear);
_zFarUniform = new osg::Uniform(“ZM”, _zFar);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值