|
希望实现的效果在这个帖子中已经贴了一张图,http://bbs.osgchina.org/forum.ph ... =%BF%C9%CA%D3%D3%F2
http://bbs.osgchina.org/forum.ph ... 3D&noupdate=yes
第一阶段,考虑用shader实现,图中的红色的线框,我是通过鼠标点击两个点(A,B)形成的,这个已经实现。在上面的那个贴子里,我最终是考虑2个条件来进行着色的:1,位于锥形线框内(距离小于半径&&角度小于视域角度的一半,相当于fovy*0.5);2,每个点的gl_Normal与(gl_position-A)的夹角,小于90则在正面,即可见,大于90 则不可见。
这个做法没有实现,分析的不正确,于是请教大师之后,采用shadowMap的方法,进入第二阶段。
第二阶段,根据rttCamera得到深度图,osg::Vec3 upDirection(0.0,0.0,1.0);
float dis=(endP-eyeP).length();
rttCamera->setProjectionMatrixAsPerspective(120,1.0,0.0,dis);
rttCamera->setViewMatrixAsLookAt(eyeP,endP,upDirection);
这样设置,虽然得到了深度图,但是结果并不是相机位于eyeP点,沿着endP-eyeP方向得到的深度,这是问题一
将得到的深度图,传给fragMentShader,函数是void getStateset(osg::Node* node,osg::Texture2D *depthTex, osg::Vec3 eyeP, osg::Vec3 endP, osg::Matrixd mat,float angle)在第一阶段所述的鼠标点击事件形成锥形线框的时候调用这个函数,如下:getStateset(model,t2d,eyeP,endP,mat,120);//mat按照我的理解,应该是世界坐标系到裁剪坐标系的变换矩阵,目前还不确定具体怎么计算,这是问题二
目前效果如图
|
|