3

QCAR SDK のカメラ フレームをレンダリングする ogre シーンの 2D 背景を作成しようとしています。これは iOS 6 を搭載した iPad です。

現時点では、renderFrameQCAR で次のようにピクセル データを取得しています。

const QCAR::Image *image = camFrame.getImage(1);

if(image) {
    pixels = (unsigned char *)image->getPixels();
}

これは、ピクセルを RGB888 形式で返し、renderOgre() 関数で私の Ogre シーンに渡します。

if(isUpdated)
     scene.setCameraFrame(pixels);
scene.m_pRoot->renderOneFrame();

setCameraFrame(pixels) 関数は次のもので構成されます。

void CarScene::setCameraFrame(const unsigned char *pixels)
{
    HardwarePixelBufferSharedPtr pBuffer = m_pBackgroundTexture->getBuffer();

    pBuffer->lock(HardwareBuffer::HBL_DISCARD);
    const PixelBox& pBox = pBuffer->getCurrentLock();

    PixelBox *tmp = new PixelBox(screenWidth, screenHeight, 0, PF_R8G8B8, &pixels);
    pBuffer->blit(pBuffer, *tmp, pBox);
    pBuffer->unlock();

    delete tmp;
}

この関数では、新しい PixelBox を作成し、そこにピクセルをコピーし、そのコピーを pixelBuffer にコピーしようとしています。

Ogre3D シーンを初めて作成するとき、m_pBackgroundTexture と背景​​の rect2d を次のように設定しました。

void CarScene::createBackground()
{
    m_pBackgroundTexture = TextureManager::getSingleton().createManual("DynamicTexture", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, m_pViewport->getActualWidth(), m_pViewport->getActualHeight(), 0, PF_R8G8B8, TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);

    m_pBackgroundMaterial = MaterialManager::getSingleton().create("Background", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);

    m_pBackgroundMaterial->getTechnique(0)->getPass(0)->createTextureUnitState("DynamicTexture");
    m_pBackgroundMaterial->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA);
    m_pBackgroundMaterial->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false);
    m_pBackgroundMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false);
    m_pBackgroundMaterial->getTechnique(0)->getPass(0)->setLightingEnabled(false);

    m_pBackgroundRect = new Rectangle2D(true);

    m_pBackgroundRect->setCorners(-1.0, 1.0, 1.0, -1.0);
    m_pBackgroundRect->setMaterial("Background");
    m_pBackgroundRect->setRenderQueueGroup(RENDER_QUEUE_BACKGROUND);

    AxisAlignedBox aabInf;
    aabInf.setInfinite();

    m_pBackgroundRect->setBoundingBox(aabInf);

    SceneNode* node = m_pSceneManager->getRootSceneNode()->createChildSceneNode();
    node->attachObject(m_pBackgroundRect);

}

この後、テクスチャのない白い背景しか表示されず、出力が表示されない理由がわかりません! これの私の目標は、カメラをバックグラウンドでレンダリングして、3D モデルを投影できるようにすることです。

ありがとう、ハリー。

4

0 に答える 0