2011-11-02 54 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