2011-11-18 2 views
3

안녕하세요. 오우거 창에 배경으로 할당 할 동적 텍스처를 만드는 동안 문제가 있습니다. 텍스처의 각 픽셀에 대해 동적으로 값을 할당하고이 텍스처를 배경으로 사용하고 싶습니다. 이 코드를 사용하여 동적 텍스처를 만듭니다. 코드의 이러한 부분에서 OGRE에서 동적 텍스처를 생성하는 동안 잘못된 RGB를 가져옵니다.

Ogre::TexturePtr texture = Ogre::TextureManager::getSingleton().createManual("BackgroundTex", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, Ogre::TEX_TYPE_2D, 800, 600, 0, Ogre::PF_R8G8B8, Ogre:: TU_DYNAMIC); 

Ogre::MaterialPtr material = Ogre::MaterialManager::getSingleton().create("BackgroundMat",Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); 
material->getTechnique(0)->getPass(0)->createTextureUnitState("BackgroundTex"); 
material->getTechnique(0)->getPass(0)->setSceneBlending(Ogre::SBT_TRANSPARENT_COLOUR); 

Ogre::Rectangle2D* rect = new Ogre::Rectangle2D(true); 
rect->setCorners(-1.0, 1.0, 1.0, -1.0); 

rect->setRenderQueueGroup(Ogre::RENDER_QUEUE_BACKGROUND); 
rect->setBoundingBox(Ogre::AxisAlignedBox(-100000.0 * Ogre::Vector3::UNIT_SCALE, 100000.0 * Ogre::Vector3::UNIT_SCALE)); 

Ogre::SceneNode* node = sceneManager->getRootSceneNode()->createChildSceneNode("BackgroundMat"); 
node->attachObject(rect); 
node->setVisible(true); 
rect->setMaterial("BackgroundMat"); 
Ogre::HardwarePixelBufferSharedPtr pixelBuffer = texture->getBuffer(); 
pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD); 
const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock(); 
Ogre::uint8* pDest = static_cast<Ogre::uint8*>(pixelBox.data); 

for(size_t i=0; i < 600; i++) 
{  
    for(size_t j=0; j < 800; j++) 
    {  
     *pDest++ = 0; 
     *pDest++ = 0; 
     *pDest++ = 255; 

    } 
} 

pixelBuffer->unlock(); 

내가 청색 (0 G : R 0 B : 255)를 할당하는 각 값에 대해. 파란 창으로 가득차는 것을 기대하지만, 파란 배경 대신 그림에서 본 배경을 얻습니다. enter image description here

파란색 배경 대신, 내가 얻는 질감에는 3 가지 색상 유형이 있으며 항상 연속적으로 반복됩니다. 파란색 픽셀은 사실이지만 다른 두 색도 파란색입니다. 이 문제를 일으키는 원인을 찾을 수 없습니다. 내가 무엇을 할 수 있을지? 잘못된 부분은 무엇입니까?

+1

나는 오우거를 사용하지 않는하지만 당신은 투명 채널 ARGB 허용된다? 당신이 여분의 * pDest ++ = 0을 필요로하는 것처럼 보입니다. – Christopher

+0

@Christopher 매우 반복적 인 패턴을 볼 때 특히 그렇습니다. –

+0

하지만 beginnig에서는 PF_R8G8B8로 텍스처를 생성하므로 알파 채널이 없습니다. 첫 번째 픽셀은 파란색이지만 두 개의 픽셀은 잘못되었습니다. 그런 순차적으로갑니다 – barzos

답변

1

크리스토퍼의 의견에 따르면

나는 Ogre3D와 경험이 없지만 대신 RGB의 실제로 당신에게 RGBA (또는 BGRA, 또는 ARGB)와 같은 이미지 데이터를 제공하는 것이 될 수 있습니다. 따라서 추가로 pDest++ (또는 아마도 *pDest++ = 255)을 놓친 것이므로 첫 번째 루프 인터 레이션에서 파란색, 녹색, 빨간색, 파란색으로 다시 나타납니다. 이는 표시되는 이미지와 어떻게 든 일치합니다.

편집 : 귀하의 의견에 (정확하게 이해한다면) 추가로 ++pDest을 루프에 추가하면 완전히 붉은 색 이미지를 얻게됩니다. 이것은 적어도 우리가 Ogre3D에서 4 컴포넌트 이미지를 얻는다는 것을 말해줍니다. 이제 우리는 더 이상 색상과 동기화되지 않고 단일 색상만을 갖기 때문입니다. 하지만이 색상은 빨간색이므로 Ogre3D는 BGRA로 이미지 데이터를 제공합니다. 따라서 첫 번째 구성 요소를 세 번째 구성 요소 대신 255로 설정하십시오. 물론이 추가 구성 요소를 ++pDest에 유지하십시오.

질감을 PF_R8G8B8으로 지정했을 수 있지만 Ogre3D는 버퍼의 이미지 데이터 레이아웃과 관련하여 약간의 자유가 있으며 사실 그래픽 드라이버는 텍스처의 메모리 레이아웃과 관련하여 자유가 있습니다. 비트 RGBA 또는 BGRA 이미지는 24 비트 RGB보다 몇 가지 장점이 있습니다.

또한 Ogre3D에서 사용하는 기본 그래픽 API (D3D 또는 GL)와 표준 인 Ogre3D에 따라 달라질 수 있습니다. 예를 들어 GL에서는 텍스처 메모리를 직접 매핑 할 수 없으며 PBO를 사용해야합니다. 메모리 레이아웃은 텍스처와 다르게 선택할 수 있습니다. 나는 D3D에 관해 모른다. 그러나 나는 D3D가 특히 BGRA 레이아웃을 좋아한다고 생각한다.

EDIT :pixelBox.format을 확인하여 데이터의 형식을 확인할 수도 있습니다.

+0

PF_R8G8B8로 텍스처를 설정했습니다. 당신이 말했듯이, 네 번째 반복으로 pDest ++를 추가하지만 네 번째 pDest ++에 어떤 값을 할당하지 않았습니다. 이 때 나는 실제로 그것이 푸른 색 이미지가 될 붉은 이미지로 가득차 있습니다. 이런 식으로 완전히 잘못된 이미지를 얻습니다. 당신의 충고는 무엇입니까? 도움이 필요합니다 – barzos

+0

@barzos 내 대답이 업데이트되었습니다. BGRA라는 이미지 데이터를 얻은 것 같습니다. –

1

같은 문제가 발생했습니다.

작성한 텍스처는 Ogre::PF_R8G8B8이지만 실제 Ogre가 사용하는 하드웨어 버퍼는 여전히 Ogre::PF_R8G8B8A8입니다. 이는 3 비트가 아닌 4 비트임을 의미합니다.

당신은 당신의 루프에서 다른 라인을 추가 할 수 있습니다

pDest++;