Я пытаюсь получить индекс трафарета узла, используя автономный рендеринг в OSG. Мои основные процедуры перечислены ниже:Ошибки FBO при получении буфера трафарета с использованием OSG
- глубоко скопируйте узел, который я хочу выполнить в автономном режиме, и получаю индекс трафарета;
- Создайте автономную камеру рендеринга и сделайте предыдущий скопированный узел дочерним элементом камеры, а затем добавьте эту камеру в качестве дочернего узла в исходный узел, который я хочу выполнить в автономном режиме;
- создать DrawCallback, который получает буфер трафарета и проверяет индексы трафарета каждого пикселя и получает максимальный индекс трафарета.
Хорошо, процедуры выглядят немного длинными. Теперь я могу получить правильный индекс максимального трафарета, однако, я получаю предупреждение и ошибки:
«RenderStage :: runCameraSetUp(), настройка FBO неудачные, статус FBO = 0x8cdd» «Предупреждение: обнаружена ошибка OpenGL» недопустимая операция 'в конце SceneView :: draw() ... "
Все коды немного длинны и утомительны. Некоторые основные фрагменты кода перечислены ниже:
void OfflineCallback::operator()(osg::RenderInfo &renderInfo)const
{
osg::Image *image = new osg::Image;
image->readPixels(0, 0, 512, 512, GL_STENCIL_INDEX, GL_UNSIGNED_BYTE);
unsigned char *dtBuf = (unsigned char *)(image->getDataPointer());
int maxStencil = 0;
for (int i = 0; i != image->s(); ++i){
for (int j = 0; j != image->t(); ++j){
unsigned char dt = dtBuf[image->s() * i + j];
if(dt > maxStencil)
maxStencil = dt;
}
}
}
Затем я создаю отключенный визуализации камеру и прикрепить трафарет буфер:
osg::Camera *camera = new osg::Camera;
camera->setClearMasks(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setRenderTargetImplementation(osg::Camera::FRAME_BUFFER_OBJECT);
camera->attach(osg::Camera::STENCIL_BUFFER, GL_UNSIGNED_BYTE);
osg::Stencil *stencil = new osg::Stencil;
stencil->setFunction(osg::Stencil::GREATER, 1, 0xff);
stencil->setOperation(osg::Stencil::INCR, osg::Stencil::INCR, osg::Stencil::INCR);
osg::Depth *depth = new osg::Depth;
depth->setFunction(osg::Depth::ALWAYS);
osg::StateSet *ss = camera->getOrCreateStateSet();
ss->setAttributeAndModes(stencil, osg::StateAttribute::ON);
ss->setAttributeAndModes(depth, osg::StateAttribute::ON);
camera->setPostDrawCallback(new OfflineCallback);
Чтобы проверить коды, создать сферу в качестве основного узла, и затем я получаю максимальный индекс трафарета как 2, который является правильным, но с ошибками и предупреждениями, упомянутыми в начале.
Что мне не хватает? Какой шаг неправильный? Любое предложение будет оценено по достоинству. Благодаря!
С уважением, Джимми
Спасибо, Reto! Ваши предложения действительно полезны. Когда я устанавливаю приложение камеры как: camera-> attach (osg :: Camera :: PACKED_DEPTH_STENCIL_BUFFER, GL_DEPTH24_STENCIL8); FBO кажется успешно создан. Тем не менее, я до сих пор не знаю, как читать его с помощью readPixels. Не могли бы вы дать какие-либо предложения по этому поводу? –