访问ogre中的视口像素值

时间:2011-11-02 15:33:26

标签: c++ background rgb ogre3d ogre

我正在使用C ++开发ogre项目。通常我使用viewport:setbackground()但这会导致整个窗口颜色相同。这次我想为每个视口的像素加载不同的R,G,B值。我的窗口是600 * 600,我必须为每个像素加载RGB值。我该如何解决这个问题?

1 个答案:

答案 0 :(得分: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));

编辑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;

或直接写入 texture-> getBuffer()Ogre API: HardwarePixelBuffer

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

...直接写入pixelbuffer ......

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

此示例可以推广到其他宽度,长度,格式等... 您可以使用更优化的代码来查找缓冲区内的像素,这只是一个示例。