Как в gles 2.0 сместить прошлый кадр влево на некоторую величину?
Добрый день. Имеется задача, рисовать на андроиде в рантайме график изменений некоторой величины, поступающей по блютус. График не совсем тривиальный, рисование на обычном канвасе не подойдет, а нужен именно gles. Связанно это с тем, что каждое значение интересуемой величины не просто обычное значение, а набор разных величин + разные интересные градиенты.
Идея такая - при поступлении нового значения в провом крае экрана с помощью gles рисуется столбец, шириной 1/200 ширины экрана. При этом кадр, отрисованный в прошлый раз, нужно сместить влево на ширину столбца.
Я реализовал это следующим образом. Стобцы графика рендерятся не на GlSurfaceView, а на битмап. Перед этим, с помощью канваса, битмап рисуется поверх себя со смещением на ширину столбца.
Хотелось бы избавиться от магии с канвасами и битмапами, и сделать на чистом gles.
Если совсем просто, то задача отрисовать произвольный кусок прошлого кадра поверх него самого, в произвольном месте экрана.
Я думаю, надо рендерить кадр в текстуру, затем отрисовывать её. Понадобятся две текстуры размером с экран. Это можно сделать на чистом gl. Тут у меня есть пример на С++, говнокод, мне за него стыдно, но идею посмотреть можно, по-моему.
Александр Шустанов: Я думаю, что будет. Текстура это тот же битмап за одним исключением - она уже лежит в видеопамяти. Битмап, когда вы с ним таким образом работаете, по идее должен гоняться туда-сюда. В любом случае, вам стоит попробовать, раз дело стоит за производительностью.
Денис Загаевский, у меня получилось реализовать на двух текстурах, однако картинка при приближении к левой стороне экрана размазывается. Не могу понять, почему так происходит. Кроме того, я попробовал тоже самое с одной текстурой, при этом она рендерится сама на себя. Вы не знаете, такое будет работать на всех девайсах, или такое поведение не обязано поддерживаться стандартом?
Александр Шустанов: размазывается это странно, проверьте всё ещё раз. Надо читать стандарт, но я бы сказал, что такое поведение подозрительно, и скорее всего не определено.
Денис Загаевский: проблема решилась установкой GL_TEXTURE_MIN_FILTER и GL_TEXTURE_MAG_FILTER на GL_NEAREST (было GL_LINEAR). я так понимаю, это обозначает, что размер текстуры не соответствовал по размеру с областью, куда я ее рендерил, что крайне странно, так как текстуры я создавал в onSurfaceChanged. буду разбираться.
спасибо за помощь)
Я думаю, чтобы всё точно было хорошо, вам надо учитывать density.
Ещё текстура, в которую ренщерите, должна быть квадратом со стороной - степенью двойки.
И вам надо делать pixel perfect, то есть никаких округлений, вообще. не должно быть такого, что вы рисуете в пол-пикселя, иначе артефакты могут полезть.