2

私は C++ を使用して ogre プロジェクトに取り組んでいます。通常は viewport:setbackground() を使用しますが、これによりウィンドウ全体が同じ色になります。今回は、ビューポートのピクセルごとに異なる R、G、B の値を読み込みます。私のウィンドウは 600*600 で、ピクセルごとに RGB 値をロードする必要があります。どうすればこの質問を解決できますか?

4

1 に答える 1

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

dataは生の 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();

... ピクセルバッファに直接書き込む ...

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

この例は、他の幅、長さ、形式などに一般化できます。より最適化されたコードを使用して、バッファー内のピクセルを見つけることができます。これは単なる例です。

于 2011-11-08T20:25:20.780 に答える