Ogre 中将Texture转成本地任意格式图片

该代码段展示了如何使用Ogre库将纹理转换为本地的任意图像格式。通过获取纹理缓冲区,然后将其复制到内存,再利用Direct3D进行处理,最后保存为指定文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bool _saveTextureToLocal(Ogre::TexturePtr texPtr, const Ogre::String& fileName)
    {
        Ogre::HardwarePixelBufferSharedPtr tmpTexBuf = texPtr->getBuffer();
        int width = texPtr->getWidth();
        int height= texPtr->getHeight();

        char* tmpBuf = new char[width*height*4];
        Ogre::PixelBox tmpBox(width,
            height,
            texPtr->getDepth(),
            texPtr->getFormat(),
            tmpBuf);
        tmpTexBuf->blitToMemory(tmpBox);

        TexturePtr tmpTexPtr = TextureManager::getSingleton().createManual ( fileName, "General",
            TEX_TYPE_2D, texPtr->getWidth(), texPtr->getHeight(), 1, 0, PF_A8B8G8R8 );
        tmpTexPtr->load();

        HRESULT hr;
        IDirect3DSurface9 *pDstSurface = 0;
        Ogre::D3D9Texture *d3dTex = reinterpret_cast< D3D9Texture * >(tmpTexPtr.get());
        RECT dstRC = {0, 0, d3dTex->getWidth(), d3dTex->getHeight()};

        if( FAILED( hr = d3dTex->getNormTexture()->GetSurfaceLevel(0, &pDstSurface) ) )
        {
            return false;
        }

        size_t rowWidth;
        if (PixelUtil::isCompressed(tmpBox.format))
        {
            // D3D wants the width of one row of cells in bytes
            if (tmpBox.format == PF_DXT1)
            {
                // 64 bits (8 bytes) per 4x4 block
                rowWidth = (tmpBox.rowPitch / 4) * 8;
            }
            else
            {
                // 128 bits (16 bytes) per 4x4 block
                rowWidth = (tmpBox.rowPitch / 4) * 16;
            }
        }
        else
        {
            rowWidth = tmpBox.rowPitch * PixelUtil::getNumElemBytes(tmpBox.format);
        }

        if( FAILED( hr = D3DXLoadSurfaceFromMemory(
            pDstSurface, NULL, &dstRC, tmpBox.data,
            Ogre::D3D9Mappings::_getPF( tmpBox.format),
            rowWidth, 0,
            &dstRC, D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER, 0)) )
        {
            SAFE_RELEASE(pDstSurface);
            return false;
        }

        Ogre::HardwarePixelBufferSharedPtr tmpDesTexBuf = tmpTexPtr->getBuffer();
        char* tmpDesBuf = new char[width*height*4];
        Ogre::PixelBox tmpDesBox(width,
            height,
            tmpTexPtr->getDepth(),
            tmpTexPtr->getFormat(),
            tmpDesBuf);
        tmpDesTexBuf->blitToMemory(tmpDesBox);
        Ogre::Image image;
        image.loadDynamicImage((Ogre::uchar*)tmpDesBox.data, tmpDesBox.getWidth(), tmpDesBox.getHeight(), tmpDesBox.format);
        image.save(fileName);

        delete [] tmpDesBuf;
        delete [] tmpBuf;

 
        tmpTexPtr.setNull();

        return true;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值