Иллюстрированный самоучитель по SVGA

Наложение рисунков и спецэффекты

В 1-м варианте примера 7.26 была приведена подпрограмма, выполняющая простое построение строки формата bgr. В отличие от нее, в данном случае код очередной точки строки не копируется в видеопамять, а помещается в регистр еах. Затем он сравнивается с кодом, указанным в переменной bkgrcod, и в случае совпадения не записывается в видеопамять, поэтому цвет соответствующей точки экрана не изменяется.

Описанную подпрограмму можно использовать при построении рисунков, хранящихся в форматах BMP (не упакованный) и PCX (упакованный). Для этого в примерах 7.25 и 7.28 достаточно просто заменить call drawiine на call spriine. Замена возможна потому, что в обоих случаях используется одна и та же подпрограмма drawiine.

Переменная bkgrcod должна быть описана в разделе данных задачи как двойное слово, содержащее код исключаемого цвета. Вопрос в том, как определить код прозрачного цвета – не задавать же его вручную. Если основное изображение окружает однородный фон, то можно предположить, что первая точка первой или последней строки рисунка имеет цвет фона. В таком случае, перед началом построения надо прочитать (программно) код первой точки образа рисунка и присвоить его значение переменной bkgrcod.

Если указанное условие не выполнено, то можно с помощью графического редактора присвоить нужной точке цвет фона. В любом случае выбранный рисунок лучше предварительно просмотреть с помощью графического редактора, поскольку точки, которые воспринимаются на глаз как одноцветные, фактически могут быть разноцветными и вам придется редактировать цвет фона.

Смешение цветов (alpha blending)

Наиболее общей формой наложения двух изображений является смещение их цветов с разными весовыми коэффициентами. На практике обычно используется так называемое "альфа-смешение", при котором вычисления выполняются по следующей формуле:

Z[i,j] = X[i,j] * alpha + Y[i,j] * (1 – alpha)

Здесь x и Y – смешиваемые изображения, a z – результат смешения. Формула применяется к каждому базовому цвету каждой точки смешиваемых изображений, поэтому i изменяется от 1 до N (N – количество точек в рисунке), a j – от 1 до 3 (по количеству базовых цветов). Допустимые значения alpha находятся в пределах от 0 до 1.

Очевидно, что при alpha = 0 Z[i,j] = Y[i,j], а при alpha = 1 Z[i,j]: = x[i, j], т. е. при граничных значениях alpha в результате смешения получается одно из двух изображений. В остальных случаях результат смешения будет зависеть как от значения alpha, так и от конкретных цветов точек. Вспомните табл. 7.6, при пропорциональном изменении значений базовых цветов точки одновременно изменяются ее яркость и цвет.

Предположим, что коды двух смешиваемых точек в формате rgb равны FF, 0, 0 и 0, FF, 0. т. е. одна из них окрашена в ярко-красный цвет, а другая – в ярко-зеленый. В зависимости от значения alpha цвет результата смешения будет изменяться от красного до зеленого, а его яркость сначала будет уменьшаться до 50%, а затем начнет возрастать до максимального значения. При aipha=0.5 получится чисто желтый цвет, но его яркость составит 50% от максимальной.

Особенности программной реализации

Прежде всего, давайте раскроем скобки в приведенной выше формуле и сгруппируем величины, умножаемые на alpha. В результате получится следующий вариант формулы:

Z[i,j] = (X[i,j3, – Y[i,j]} * alpha + Y[i,j]

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

Теперь о значениях alpha. Величины x[i,j], Y[i, j] и z[i, j] являются кодами базовых цветов точек изображений, поэтому их значения заключены в пределах от 0 до 255 (или от о до OFFh). Умножать такие величины на дроби неудобно, поэтому при программной реализации значения alpha задаются в виде целых чисел, изменяющихся в пределах от 0 до 255, а результат умножения делится на 256. Фактически деление на 256 не требуется, достаточно просто использовать старший байт произведения. При таком представлении граничными значениями aipha будут 0 и 255/256 = 0.9961, но с учетом реальной точности вычислений отличие верхнего предела от 1 не имеет существенного значения.

Давайте упростим задачу и рассмотрим частный случай, когда z = у и изображение z находится на экране, а коды его точек, соответственно, в видеопамяти. Это позволит нам рассмотреть простой вариант подпрограммы, которая вместо смешения изображений, хранящихся в двух файлах, выполняет наложение изображения, хранящегося в файле, на изображение, находящееся на экране. Текст подпрограммы, выполняющей наложение строки формата bgr на строку, расположенную в видеопамяти, приведен в примере 7.30, предполагается, что установлен видеорежим True Color.

Входные параметры задаются так же, как для всех описанных подпрограмм построения строки (drawline):

  • в регистрах fs.-si указывается адрес начала строки в оперативной памяти;
  • в регистре di – адрес ее начата в видеопамяти;
  • в регистре сх – количество точек в строке.

Как обычно, должно быть установлено окно видеопамяти, а регистр es должен содержать код видеосегмента.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.