查看: 3369|回复: 6

OSG::Image copySubImage 中gluScaleImage总是返回1285"内存不足"的问题

[复制链接]

该用户从未签到

发表于 2009-4-16 18:24:33 | 显示全部楼层 |阅读模式
环境:VS2005 OSG2.8
        ref_ptr< osg::Image > rpImgTemp;
        sprintf(strPath, "%s\\images\\LeftTop.gif", g_IO.m_ExeResPath);
        rpImgTemp = osgDB::readImageFile(strPath);

        osg::Image* pImgLabel = new osg::Image;
        pImgLabel->allocateImage(512, 512, 1, rpImgTemp->getPixelFormat(), rpImgTemp->getDataType());

        pImgLabel->copySubImage(0, 0, 0, rpImgTemp);

在 OSG::Image copySubImage 中gluScaleImage总是返回1285"内存不足",看了这个贴子后
http://bbs.osgchina.org/viewthre ... hlight=copySubImage
也创建了RC,但是还是一样返回1285,创建大致如下:(在VIEW中)
BOOL CGMView:reCreateWindow(CREATESTRUCT& cs)
{
        cs.style |= (WS_CLIPCHILDREN | WS_CLIPSIBLINGS);
        return CView::PreCreateWindow(cs);
}

int CGMView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
        if (CView::OnCreate(lpCreateStruct) == -1)
                return -1;
        HWND hWnd = this->GetSafeHwnd();   
        HDC hDC = ::GetDC(hWnd);
        if(this->SetWindowPixelFormat(hDC)==FALSE)
                return 0;
        if(this->CreateViewGLContext(hDC)==FALSE)
                return 0;
        return 0;
}

BOOL CGMView::SetWindowPixelFormat(HDC hDC)
{
        PIXELFORMATDESCRIPTOR pixelDesc=
        {
                sizeof(PIXELFORMATDESCRIPTOR),
                1,
                PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|
                PFD_DOUBLEBUFFER|PFD_SUPPORT_GDI,
                PFD_TYPE_RGBA,
                24,
                0,0,0,0,0,0,
                0,
                0,
                0,
                0,0,0,0,
                32,
                0,
                0,
                PFD_MAIN_PLANE,
                0,
                0,0,0
        };

        this->m_GLPixelIndex = ChoosePixelFormat(hDC,&pixelDesc);
        if(this->m_GLPixelIndex==0)
        {
                this->m_GLPixelIndex = 1;
                if(DescribePixelFormat(hDC,this->m_GLPixelIndex,sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
                        return FALSE;
        }

        if(SetPixelFormat(hDC,this->m_GLPixelIndex,&pixelDesc)==FALSE)
                return FALSE;
        return TRUE;
}

BOOL CGMView::CreateViewGLContext(HDC hDC)
{
        this->m_hGLContext = wglCreateContext(hDC);
        if(this->m_hGLContext==NULL)
                return FALSE;

        if(wglMakeCurrent(hDC,this->m_hGLContext)==FALSE)
                return FALSE;
        return TRUE;
}

请问还要做什么工作么? 实在不知道怎么回事了

该用户从未签到

发表于 2009-4-16 21:46:56 | 显示全部楼层
我不是很了解您想要实现的功能,也不清楚copySubImage是在什么地方调用的,也许更详细地说明一下能够让大家进一步帮助您解决问题

该用户从未签到

发表于 2009-4-16 22:14:38 | 显示全部楼层
首先得到图形环境,,才能再拷贝~~~~~~

该用户从未签到

 楼主| 发表于 2009-4-17 12:10:21 | 显示全部楼层

回复 2楼 的帖子

我想用osg::Image拼图,也就是把几个小的图片(GIF),拷到一个osg::Image里,变成一个大的图片.这时候发现copySubImage不起作用,跟到里面发现
GLint status = gluScaleImage(_pixelFormat,
        source->s(),
        source->t(),
        source->getDataType(),
        source->data(),
        source->s(),
        source->t(),
        _dataType,
        data_destination);
这个函数总是返回1285

该用户从未签到

 楼主| 发表于 2009-4-17 12:11:06 | 显示全部楼层

回复 3楼 的帖子

图形环境是指什么? osg::GraphicsContext么?

该用户从未签到

发表于 2009-4-17 12:27:49 | 显示全部楼层
初步猜测您没有在copyImage的时候取得合法的图形环境,对于OpenGL来说也就是没有设置合法的RC(wglMakeCurrent)。
OSG默认在每一帧渲染结束都会关闭RC设备,因此直接在仿真循环之外写copyImage是没有效果的,必然失败。正确的方法是在Camera:: PostDrawCallback中编写相应的代码;另一种冒险的方法是设置viewer.setReleaseContextAtEndOfFrameHint(false),不过对于多线程模型这可能带来别的问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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