получить доступ к значениям пикселей в окне просмотра - PullRequest
2 голосов
/ 02 ноября 2011

Я работаю над проектом OGRE с использованием C ++. Обычно я использую viewport: setbackground (), но это вызывает все окно одного цвета. На этот раз я хочу загрузить разные значения R, G, B для каждого пикселя области просмотра. Мое окно 600 * 600, и я должен загрузить значения RGB для каждого пикселя. Как я могу решить этот вопрос?

1 Ответ

4 голосов
/ 09 ноября 2011

Если вы хотите установить фон, вы можете сделать это:

Создание прямоугольника, который заполняет весь видовой экран

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();

... записывать напрямую в pixelbuffer ...

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

Этот пример можно обобщить для другой ширины, длины, формата и т. Д. Вы можете использовать более оптимизированный код для поиска пикселя внутри буфера, это всего лишь пример.

...