Использование буфера для выбора объектов: проблемы точности - PullRequest
1 голос
/ 26 января 2011

в каждом кадре (как в кадрах в секунду), который я рендерил, я делаю его уменьшенную версию, используя только объекты, которые пользователь может выбрать (и любые объекты, препятствующие выделению).В этом буфере я отрисовываю каждый объект другим цветом.Когда у пользователя есть mouseX и mouseY, я смотрю в этот буфер, какой цвет соответствует этой позиции, и нахожу соответствующие объекты.Я не могу работать с FBO, поэтому я просто отображаю этот буфер в текстуру и масштабирую текстуру ортогонально на экране, и использую glReadPixels, чтобы прочитать «горячую область» вокруг курсора мыши. Я знаю, не самая эффективная, но производительнаяпока все в порядке.

Теперь у меня проблема в том, что у этого буфера с «цветными объектами» есть некоторые проблемы с точностью.Конечно, я отключаю все шейдеры освещения и рамки, но все равно получаю артефакты.Очевидно, мне действительно нужны чистые листы цвета без каких-либо отклонений.

Screenshot here

Обратите внимание, что здесь я помещаю всю информацию о цвете в беззнаковый байт в GL_RED.(на данный момент у меня максимально 255 выбираемых объектов).

Это вызвано изменением масштаба текстуры?(Я мог бы заменить это, просматривая масштабированные координаты в небольшой текстуре.), Или мне нужно отключить какой-нибудь другой флаг, чтобы действительно получить цвета, которые я хочу.Можно ли надежно использовать эту технику?

Ответы [ 3 ]

2 голосов
/ 26 января 2011

Похоже, вы используете GL_LINEAR для GL_TEXTURE_MAG_FILTER.Вместо этого используйте GL_NEAREST, если не хотите интерполировать цвета.

0 голосов
/ 26 января 2011

Что именно вы подразумеваете под "дисперсией"? Пожалуйста, объясните более подробно.

Теперь несколько советов: в случае, если ваш рендеринг не зависит от операций буфера трафарета, вы можете поместить идентификатор объекта в буфер трафарета при передаче рендеринга в само окно, не используйте обход по отдельной текстуре. На текущем оборудовании вы обычно получаете 8 бит трафарета. Конечно, лучшим решением, если вы хотите использовать подход с индексным буфером, является использование нескольких целей рендеринга и рендеринг идентификатора объекта в буфер индекса вместе с цветом и другим материалом за один проход. Смотри http://www.opengl.org/registry/specs/ARB/draw_buffers.txt

0 голосов
/ 26 января 2011

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

Вы должны.Изменение масштаба обходится дороже, чем преобразование координат наверняка.

Тем не менее, масштабирование однородной текстуры не должно приводить к появлению артефактов, если вы сохраняете целочисленное соотношение (например, увеличение в 2 раза) без какой-либо сложной фильтрации.Он выглядит размытым на краях многоугольника, поэтому я предполагаю, что это не то, что вы используете.

Кроме того, изменение масштаба должно вводить вариации только на границах многоугольника.Вы проверили, что в немасштабированной текстуре нет изменений?Это подтвердит, является ли масштабирование тем, что вводит ваши "артефакты".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...