查看: 1581|回复: 13

zbuffer读取问题

[复制链接]

该用户从未签到

发表于 2011-8-15 22:26:09 | 显示全部楼层 |阅读模式
本帖最后由 hyd66hyd 于 2011-8-15 22:52 编辑

一直在尝试在一个漫游程序中读取深度缓存
可是读出来的值都是1
代码如下:
class PostDrawCallback:public osg::Camera:rawCallback
{
public:
        PostDrawCallback(osg::Image* reImage)
        {
                image=reImage;
        }
        virtual void operator()(const osg::Camera &camera) const
        {
                if (flagImage==1)
                {
                        image->readPixels(static_cast<int>(camera.getViewport()->x()),static_cast<int>(camera.getViewport()->x()), static_cast<int>(camera.getViewport()->width()), static_cast<int>(camera.getViewport()->height()), GL_DEPTH_COMPONENT, GL_FLOAT);
                }
        }
public:
        osg::Image* image;
};
int flagImage=1;
osg::Image * depthBuffer = new osg::Image();
……
switch(ea.getEventType())
        {
        case(osgGA::GUIEventAdapter::FRAME):
                {
              ……
             depthBuffer->allocateImage(1280, 1024, 1,GL_DEPTH_COMPONENT,GL_FLOAT);
            _viewer->getCamera()->setPostDrawCallback(new PostDrawCallback(depthBuffer));
              ……
                }
        default:
                return false;
        }
}
请教了Array 他说是readPixels的参数问题 后面也没说怎么改
我看不出改怎么修改
求大家能帮帮我 很急
因为假期一直在学校 做完就能回家了  眼看暑假就要没了
如果Array看到 麻烦能告诉我 怎么才能读到正确z值 也求大家帮忙

该用户从未签到

发表于 2011-8-16 00:15:48 | 显示全部楼层
读取代码应该在绘制完毕后执行。

该用户从未签到

发表于 2011-8-16 08:24:56 | 显示全部楼层
您的代码很不完全,并且有些让人生惑的地方,请参考osgautocapture这个例子,并且把readPixels的参数改成获取深度值得参数

该用户从未签到

 楼主| 发表于 2011-8-16 10:07:57 | 显示全部楼层
回复 2# sky11811

谢谢您!!
您是说在frame事件里面 没有办法获取深度信息吗?
我需要的数据是每帧的深度信息,然后再帧事件中做判断深度,这能实现吗?

该用户从未签到

 楼主| 发表于 2011-8-16 10:16:03 | 显示全部楼层
回复 3# array

谢谢Array!我正在看osgAutoCapture
再麻烦你下
这个readPixels的参数(GLint x,GLint y,GLsizesi width,GLsizei height,GLenum format,GLenum type)
x和y指定图像区域左下角坐标,width和height分别是图像的高度和宽度,format我是用GL_DEPTH_COMPONENT单个深度分量,
type是GL_FLOAT  您能告诉我 我哪个参数错了吗?应该用什么?

该用户从未签到

发表于 2011-8-17 01:46:31 | 显示全部楼层
viewer->getCamera()->setPostDrawCallback(new PostDrawCallback(depthBuffer));
似乎不用在事件响应里调用吧,在初始化时调用一次应该就可以了。
你跟踪virtual void operator()函数看看,看看里面的image有没有变化。
不行再试试setFinalDrawCallback函数看看。

该用户从未签到

发表于 2011-8-17 01:49:24 | 显示全部楼层
我正式学习OSG就几天,不过我学习OpenGL很久了,你思路没有错。

该用户从未签到

发表于 2011-8-17 02:52:34 | 显示全部楼层
你确认你的PostDrawCallback被调用了吗。

该用户从未签到

 楼主| 发表于 2011-8-17 09:14:28 | 显示全部楼层
回复 8# sky11811


    非常感谢您~~ 在凌晨还帮我!
未命名.gif
    PostDrawCallBack 被调用了 image也被赋值了 初始化的时候 全是0,被赋完值 全是1.改成setFinalDrawCallback 也是这样 读不到正确的值

该用户从未签到

 楼主| 发表于 2011-8-17 09:27:09 | 显示全部楼层
回复 8# sky11811


    我把调用改到初始化里面了,也是不行。在main函数里调用,也不行。天天调啊调,一点进展都没有。我快崩溃了

该用户从未签到

发表于 2011-8-17 10:09:07 | 显示全部楼层
求取深度的话,要关闭远近平面的自动计算,不然会对结果有影响

该用户从未签到

 楼主| 发表于 2011-8-18 10:39:50 | 显示全部楼层
回复 11# array


    Array您好!谢谢您的回答!
    我把自动计算远近裁面也不行。非常难受 先不做这部分了!

该用户从未签到

发表于 2011-8-19 08:40:26 | 显示全部楼层
反正这一功能在osgXI里早就实现了,也没什么难度~~呵呵

该用户从未签到

发表于 2011-8-21 21:05:21 | 显示全部楼层
我按照楼主的做法实现了,没有问题,完全正确啊。
楼主的参数都是正确的。
不知道楼主怎么调试的,需要把image的data,memcpy到float的数组里。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表