Вопрос по android – Создание эффектов ластика с использованием libgdx и OpenGL ES

11

Пожалуйста, рассмотрите следующие изображения для иллюстрации: enter image description here

Сначала я заполняю весь экран / сцену отдельными изображениями, пока экран не станет розовым. Каждый шарик розового цвета - это индивидуальный образ актера, которого я добавляю на сцену.

Теперь я хочу реализовать метод touchDown таким образом, чтобы каждый раз, когда пользователь прикасался к экрану, он стирал часть изображения, где происходило событие касания. Однако это событие касания не должно влиять на другие изображения / актеры / TextureRegions, которые находятся позади или выше актеров розового шарика. Как я должен достичь этого в libgdx с помощью OpenGL ES? Пожалуйста, помогите мне в этом отношении.

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

Может быть проще, если вы знаете, какой цвет будет стерт сейчас .. Ronnie
При касании, хотите ли вы, чтобы "полное изображение" было "стерто"? Означает ли стирание запись белых значений в пиксели или их прозрачность? Вы используете OpenGL ES 2? libgdx, кажется, поддерживает это. Stefan Hanke
@ StefanHanke Нет. Я намереваюсь стереть только часть изображения, где произошло событие касания. И я хочу сделать их прозрачными, а не окрашивать их в белый цвет, чтобы фон стал видимым. Rafay
@ userSeven7s Хорошо, если я знаю, какого цвета стереть, то как мне это сделать? Rafay

Ваш Ответ

1   ответ
5

Установите FBO для своего "розового" слой и трафаретный буфер для него. При касании нарисуйте ваше прикосновение в качестве маски к буферу трафарета для розового FBO. Теперь, когда вы рисуете розовое FBO, области, к которым вы прикоснулись, не будут отрисованы, поэтому вы сможете видеть фоновое FBO за ним.

Эта ссылкаhttp://www.opengl.org/archives/resources/faq/technical/rasterization.htm, раздел 14.050 рассказывает, как настроить буфер трафарета:

You can set up OpenGL state as follows:

glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0x1, 0x1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

Subsequent rendering will set a 1 bit in the stencil buffer for every pixel rendered.

Возможно, вам придется возиться с вещами, чтобы ваша маскировка была правильной (маски там, где вы их касались, а не там, где вы этого не делали).

Да, я полагаю. FBO можно рассматривать как текстуру, просто изменить содержимое FBO проще и быстрее, поскольку вы просто используете обычные методы рисования opengl, а не модифицируете связанную текстуру. Вы по-прежнему будете рисовать ваши изображения (в виде текстур) в fbo, но когда вы вытаскиваете ваше FBO, вы делаете это с помощью буфера трафарета, маскирующего определенные его области.
libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/graphics/glutils/… libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/utils/… badlogicgames.com/wordpress/?p=1923  Я уже ищу, как это сделать, используя буферы, как вы предложили. Rafay
Итак, вся идея состоит в том, чтобы установить буферы на текстуре и изменить отдельные пиксели этих текстур. Я прав?? Rafay
Идея трех стеков (XYZ) - именно то, что я хочу. Теперь, когда вы обсуждаете здесь буферы, будет ли эта операция достаточно гладкой, чтобы поток рендеринга не создавал заметного дрожания? Так как я относительно новичок в OpenGL ES, я понятия не имею, как работают буферы, поэтому мне придется попробовать что-то с нуля. Дело в том, что я должен быть уверен, что этот подход является лучшим для того, что я хочу сделать здесь. Что касается буфера FBO и трафарета, да, я могу их использовать, но не знаю как. Ниже приведено несколько ссылок на FBO и трафаретный буфер в рамках. Rafay
Теперь, когда я думаю об этом немного больше, вам действительно не нужно три FBO, только одно с буфером трафарета для соответствия. Я отредактировал вопрос, чтобы стать лучше. В этом ответе есть кое-что о производительности FBOstackoverflow.com/a/2203931/959304 но я бы просто проигнорировал производительность, пока она не заработает, и если производительность ухудшится,then заплатить дополнительную сложность кода, которая придет, когда вы хотите оптимизировать.

Похожие вопросы