2012-04-29 3 views
11

Пожалуйста, обратите внимание на следующие изображения для иллюстрации: enter image description hereПроизводить эффект ластика с использованием libgdx и OpenGL ES

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

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

Я нашел эту ссылку, которая объясняет, как изменить TextureRegion, но я не знаю, как я собираюсь решить проблему, используя технику, описанную в этом блоге. Here is the link

+0

на ощупь, вы хотите полное изображение будет «стерты»? Стирает ли среднее значение белого значения для пикселей или делает их прозрачными? Вы используете OpenGL ES 2? Кажется, что libgdx поддерживает его. –

+0

@StefanHanke Нет. Я намерен стереть только часть изображения, в котором произошло событие касания. И я хочу сделать их прозрачными, а не окрашивать их в белый цвет, чтобы фон стал видимым. – Rafay

+0

Это может быть проще, если вы знаете, какой цвет будет удален сейчас. – Ronnie

ответ

5

Не могли бы вы использовать FBO и буфер трафарета?

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

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

Вы можете настроить OpenGL состояние следующим образом:

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

После рендеринга будет установлен 1 бит в буфера трафарета для каждых пикселей.

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

+0

Идея трех штабелированных (XYZ) - именно то, что я хочу. Теперь, когда вы обсуждаете буферы здесь, будет ли операция достаточно гладкой, чтобы не создавать поток рендеринга для создания заметного джиттера? Поскольку я относительно новичок в OpenGL ES, я понятия не имею, как работают буферы, поэтому мне придется попробовать все с нуля. Дело в том, что я должен быть уверен, что этот подход является лучшим для того, что я хочу здесь сделать. Что касается буферов FBO и трафаретов, да, я могу их использовать, но я не знаю, как это сделать. Ниже приведены несколько ссылок на буфер FBO и трафарет в буфере. – Rafay

+0

http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/graphics/glutils/FrameBuffer.html http://libgdx.l33tlabs.org/docs/api/com/badlogic/gdx/ utils/BufferUtils.html http://www.badlogicgames.com/wordpress/?p=1923 Я уже ищу, как это сделать, используя буферы, как вы предложили. – Rafay

+1

Теперь, когда я думаю об этом немного больше, вам действительно не нужны три FBOs, только один с буфером трафарета для соответствия. Я отредактировал вопрос, чтобы быть лучше. В этом ответе есть некоторые сведения о производительности FBO http://stackoverflow.com/a/2203931/959304, но я бы просто проигнорировал производительность до тех пор, пока она не будет работать, и если производительность ухудшится, _then_ заплатите дополнительную сложность кода, которая придет, когда вы захотите для оптимизации. – Soup

 Смежные вопросы

  • Нет связанных вопросов^_^