opengl — Cinder & amp; C ++: зеркальная текстура и эффективные вопросы рисования

  1. Допустим, у меня есть персонаж, который направлен вправо, и мне нужно отразить изображение так, чтобы он теперь смотрел влево. Как мне это сделать? Я нашел метод переворота в gl::Texture, но это переворачивает вертикально, а не горизонтально.

  2. Я заметил, что если я не очистить все окно во время draw() метод, то что бы я ни нарисовал последний последний кадр все еще присутствует. Это хорошо, потому что я хочу обновить только те изменения, но как удалить конкретный gl::Texture из текущего кадра?

0

Решение

Есть много способов добиться этого эффекта. Какой из них работает лучше всего, зависит от того, как вы рисуете свои текстуры. Поскольку вы начинаете с Cinder, я думаю, вы используете функцию ci :: gl :: draw и передаете ей объект TextureRef. В этом случае простой способ нарисовать перевернутую текстуру (вы можете поместить ее там, где рисуете свою текстуру):

// This is to get a "fresh" coordinate system for drawing and to make sure
// you can clean up after you're done
ci::gl::pushMatrices();

// Move the coordinate system to where you want to draw the texture
ci::gl::translate(ci::Vec2f(100, 100));

// Scaling the coordinate system by -1 effectively flips that axis
// (e.g. whatever was going to be drawn at x: 10 will now be drawn at x: -10)
ci::gl::scale(ci::Vec3f(-1, 1, 1));

// Draw your texture
ci::gl::draw(texture);

// Clean up after yourself so any drawing calls after this don't use your modified
// coordinates
ci::gl::popMatrices();

Нет действительно простого способа сделать то, что вы описываете (то есть отрисовать буфер кадра, а затем удалить все пиксели, связанные с конкретной текстурой). Однако, в зависимости от эффекта, которого вы пытаетесь достичь, может быть несколько способов сделать то, что вы хотите, но все они будут относительно продвинутыми. Например, вы можете нарисовать текстуры, которые вы хотите удалить, в «текстурный» буфер, а все остальное в «фоновом» буфере. В каждом кадре вы будете рисовать фоновый буфер, а затем текстурный буфер поверх него. Когда вы захотите «удалить» буфер текстур, вы просто перестанете его рисовать.

Постскриптум — Я рад подробнее рассказать о том, как рисовать несколько буферов (на самом деле, Cinder делает это относительно легко), но только если это кроличья нора, вы думаете, что хотите нырнуть вниз;)

1

Другие решения

Итак, я не знаком с библиотекой Cinder, чтобы иметь возможность сказать, есть ли способ перевернуть изображение по горизонтали. Однако для цели, которую вы проиллюстрировали в пункте 1, вы, вероятно, не хотите переворачивать само изображение. Метод flip, присутствующий в Cinder’s Texture, фактически перевернет пиксели изображения, создав новую текстуру. Это дорогой способ называться, когда вы хотите, чтобы ваш персонаж оказался лицом к лицу. Вместо этого вам нужно просто применить преобразование вращения к спрайту. Я уверен, что вы можете узнать это из библиотеки примеры и документация, кажется довольно полным.

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

0