2011-11-02 21 views
2

我正在使用C++編寫食人魔項目。通常我使用viewport:setbackground(),但這會導致整個窗口的顏色相同。這次我想爲每個視口的像素加載不同的R,G,B值。我的窗口是600 * 600,我必須爲每個像素加載RGB值。我該如何解決這個問題?在食人魔中訪問視口像素值

回答

4

如果你想設置一個背景,你可以這樣做:

創建一個矩形,填充所有視

Rectangle2D* rect = new Rectangle2D(true); 
rect->setCorners(-1.0, 1.0, 1.0, -1.0); 
rect->setRenderQueueGroup(RENDER_QUEUE_BACKGROUND); 
rect->setBoundingBox(AxisAlignedBox(-100000.0 * Vector3::UNIT_SCALE, 100000.0 * Vector3::UNIT_SCALE)); 
SceneNode * node = sceneManager->createChildSceneNode("Background"); 
node->attachObject(rect); 

創建材質和紋理

TexturePtr texture = TextureManager::getSingleton().createManual("BackgroundTex", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, TEX_TYPE_2D, 600, 600, 0, PF_R8G8B8, TU_DYNAMIC_WRITE_ONLY_DISCARDABLE); 
MaterialPtr material = MaterialManager::getSingleton().create("BackgroundMat", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); 
Technique* technique = material->createTechnique(); 
technique->createPass(); 
technique->getPass(0)->setLightingEnabled(false); 
technique->getPass(0)->createTextureUnitState("BackgroundTex"); 
rect->setMaterial("BackgroundMat"); 

現在您可以複製你的RGB數據直接紋理幀緩衝:

texture->getBuffer()->blitFromMemory(PixelBox(600, 600, 1, PF_R8G8B8, (void*) data)); 

EDIT 2011-11-10

數據必須是一個有效的指針原始RGB的幀緩存。你可以初始化它:

unsigned char* data = new unsigned char[600 * 600 * 3]; 

而不是直接向位置x,y處的像素寫入黃色。

unsigned char* red = &data[(x + y * width) * 3]; 
unsigned char* blue = &data[(x + y * width) * 3 + 1]; 
unsigned char* green = &data[(x + y * width) * 3 + 2]; 
*red = 255; 
*blue = 0; 
*green = 255; 

或者直接寫入提升口感>的GetBuffer()Ogre API: HardwarePixelBuffer

unsigned char* data = (unsigned char*)texture->getBuffer()->lock(); 

...直接寫入pixelbuffer ...

texture->getBuffer()->unlock(); 

這個例子可以是對其他寬度,長度,格式等進行一般化... 您可以使用更優化的代碼來查找緩衝區內的像素,這是隻是一個例子。

+0

其漂亮的代碼部分,但我想爲紋理的每個像素設置不同的RGB值,而不是整個紋理的RGB值。我怎樣才能做到這一點 ? – barzos

+0

我已經解釋過,告訴你如何直接寫入pixelbuffer,所以你可以改變你想要的。現在我已經添加了更多關於如何找到給出座標並寫入座標的像素的信息。 –

+0

根據此代碼,您無法爲每個像素分配值。首先將位置值分配給*紅色,*藍色和*綠色。之後,您將顏色值分配給*紅色。也就是說,位置將會以*紅色消失。這部分沒有意義無符號char * red = data [(x + y * width)* 3]; – barzos