Open Source, Soft Renderer 2D.

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

Модератор: BV

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 17.08.2006 (Чт) 16:38

Mikle
А какие ещё фичи ты планируешь добавлять?
#define ROFL 0xDDDD

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 17.08.2006 (Чт) 16:46

DirectXManiac
Еще два вида бампа, кое-что уже есть. Еще специальную команду для перезаписи какого-либо цветового слоя, например из канала R одного спрайта в канал A другого, это уже есть. Еще есть работа с битовыми слоями.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 17.08.2006 (Чт) 16:48

Mikle
Какие 2 вида бампа? Dot3 и EMBM?
#define ROFL 0xDDDD

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 17.08.2006 (Чт) 16:56

Да. Уже есть один вид EMBM, будет еще второй с другой адресацией и DOT3.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 17.08.2006 (Чт) 17:38

А то что на всех примерах FPS больше 10 не поднимается, это так и надо? :roll:
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 17.08.2006 (Чт) 18:01

keks-n
А на коком компе? А то у меня ниже 300 не опускается.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 17.08.2006 (Чт) 19:11

Mikle
Это будет супер! Бамп в 2Д
Не мог бы ты выложить пример нормального EMBM на шейдерах т.е. vs + ps в 3Д? А то у меня как обычно лажа с vs
ЗЫ. Сори за оффтоп!
#define ROFL 0xDDDD

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.05.2007 (Чт) 16:33

Первый релиз готов, выложил в кирпичах:
http://bbs.vbstreets.ru/viewtopic.php?t=32517

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 05.07.2007 (Чт) 22:47

Привет.

У меня возникло несколько проблем в работе с твоим движком, той версией, что выложена в кирпичах:

При загрузке картинки из файла при включённом ColorKey, красный и синий каналы ColorKey меняются местами. Например, я указываю vbRed, а прозрачным становится синий, если указываю vbBlue, то прозрачный красный. Если указываю зелёный, то всё нормально.

При рисовании на спрайте в режиме AlphaBlend не рисуется Alpha.
Пример: есть tga картинка с прозрачностью. Рисую её на спрайте 1 в режиме AlphaBlend. Рисую спрайт 1 на спрайте 2, тоже в режиме AlphaBlend. На спрайте 2 ничего не рисуется. Проверяю в режиме AlphaTest – всё работает. Но при AlphaTest значение Alpha равно либо 255 либо 0, что не подходит при работе с полупрозрачными изображениями. Рисовать сразу на спрайте 2 невозможно, спрайт 1 должен пройти, например, постобработку.

Примеры работы прилагаются в архиве. Посмотри, может я чего напутал?
И ещё, в архиве, в папке CONW лежит простой конвертор в формат TGA.

П.С.: когда будет новое обновление?
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось Crio 05.07.2007 (Чт) 23:48, всего редактировалось 1 раз.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 05.07.2007 (Чт) 22:56

При загрузке картинки из файла при включённом ColorKey, красный и синий каналы ColorKey меняются местами. Например, я указываю vbRed, а прозрачным становится синий, если указываю vbBlue, то прозрачный красный. Если указываю зелёный, то всё нормально.

Это не баг, а другой формат цвета, который реально используется для хранения изображений. Напиши простенькую функцию, которая меняла бы 1-ый и 3-ий байт в переменной с цветом местами.
Изображение

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 05.07.2007 (Чт) 23:46

А какой из форматов самый правильный? Тот, который в компиляторе или тот, который в движке.

Это себе на будущее...

П.С.: Э-э-э... Простенькую функцию, чтобы байты местами меняла?.. Можно мне пример такой простенькой функции личным сообщением отправить?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 06.07.2007 (Пт) 0:05

Crio
Оба правильные. Есть ещё и 555 и 565 - они 16-тибитные. Есть вообще палитра. Форматов множество.
Код: Выделить всё

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)



Function RGBToBGR(ByVal Color As Long) As Long
Dim ar(4) As Byte
CopyMemory ar(0), Color, 4
ar(4) = ar(0)
ar(0) = ar(2)
ar(2) = ar(4)
CopyMemory Color, ar(0), 4
RGBToBGR = Color
End Function
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.07.2007 (Пт) 0:21

П.С.: Э-э-э... Простенькую функцию, чтобы байты местами меняла?.. Можно мне пример такой простенькой функции личным сообщением отправить?


Какое именно образом менять? RGBA => ABGR? RGBA => BGRA ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 06.07.2007 (Пт) 15:42

То Хакер:
Напиши простенькую функцию, которая меняла бы 1-ый и 3-ий байт в переменной с цветом местами.


Тут альфа то и не нужна. Это тот случай, когда в картинке альфы нет, а движок её принудительно ставит вместо указанного ColorKey.

То keks-n: спасибо, мне только принцип был нужен. А за полную функцию огромное спасибо! Долго думал зачем в массиве пять элементов... Дошло...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.07.2007 (Пт) 16:06

Crio
Байты R и B менять не нужно, этот формат используется, например, в DirectX. Лучше написать новую функцию вместо RGB() и ее использовать, как будет обновление - добавлю такую ф-цию прямо в движек. А обновление будет, как закончу портирование под vb.NET.
Пример с нерабочей альфой качаю, дома гляну.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 07.07.2007 (Сб) 8:51

Crio
Посмотрел твою работу. Отображение спрайта 1 на 2 с использованием альфаканала, а затем 2 на 3 тоже с использованием альфаканала, это неверный подход - будут искажения цвета везде, где 0<A<255. С 1 на 2 можно отображать через OpPaint, дальше какая угодно постобработка и отображение 2 на 3 через AlphaBlend.
Если, все же, нужно оба раза через AlphaBlend, то применяй для переноса альфы OpMoveByte:

Код: Выделить всё
Option Explicit

Dim Sp1 As New SR2D_Sprite
Dim Sp2 As New SR2D_Sprite

Private Sub Form_Load()
  Sp1.LoadFromTGA "in.tga"
  Sp2.Init Sp1.Width, Sp1.Height

  Sp2.Draw Sp1, 0, 0, OpAlphaBlend

  Sp2.Draw Sp1, 0, 0, OpMoveByte, 3, 3

  Sp2.SaveToTGA "out.tga", True

  Set Sp1 = Nothing
  Set Sp2 = Nothing
End Sub


"Sp2.Draw Sp1, 0, 0, OpMoveByte, 3, 3" переносит третий цветовой канал, считая от нуля, из источника в третий цветовой канал приемника. С помощью OpMoveByte можешь доделать свой конвертер для сборки TGA с импортом альфы из отдельного файла.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 07.07.2007 (Сб) 14:34

Ясно... А если новый эффект наложения ввести?
Где сразу цвета смешивается как в AlphaBlend, а альфа-каналы складываются с максимальным порогом в 255

Или уже нельзя?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 07.07.2007 (Сб) 19:18

Crio
Это не сложно. Убеди в необходимости. Текущее использование альфаканала складывалось годами.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 09.07.2007 (Пн) 2:28

Код: Выделить всё
Function fncLayering(sprSpriteSource As SR2D_Sprite, sprSriteTarget As SR2D_Sprite, Optional lngTrgTop As Long, Optional lngTrgLeft As Long)
'Наложение спрайта с альфа-каналом поверх другого спрайта
'sprSpriteSource - спрайт-источник
'sprSriteTarget  - спрайт-цель
'lngTrgTop       - позиция верхнего края в sprSriteTarget
'lngTrgLeft      - позиция левого края в sprSriteTarget

sprSriteTarget.Draw sprSpriteSource, lngTrgLeft, lngTrgTop, OpAlphaBlend
sprSriteTarget.Draw sprSpriteSource, lngTrgLeft, lngTrgTop, OpMoveByte, 3, 3

End Function


Два прохода на один спрайт...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 09.07.2007 (Пн) 9:54

Crio
Это понятно, не понятно зачем нужно, чтобы после альфаналожения на приемник попадала альфа источника. Если ты обрисуешь задачу, может станет понятнее?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 09.07.2007 (Пн) 14:13

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

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 09.07.2007 (Пн) 19:09

Почему происходит искажение цвета.
Всё дело, в том, что смешивается. А смешивается цвет загруженного спрайта с начальным цветом спрайта-буфера, то есть чёрным. Если его предварительно покрасить в красный, то искажение будет красным.
Как это исправить? Сижу-думаю...

Моя функция Layering работает неправильно. Альфа-канал просто переносится из sprSpriteSource в sprSriteTarget, а они должны складываться.

Код: Выделить всё

Function fncLayering(sprSpriteSource As SR2D_Sprite, sprSpriteTarget As SR2D_Sprite, Optional lngTrgTop As Long, Optional lngTrgLeft As Long)
'Наложение спрайта с альфа-каналом поверх другого спрайта
'sprSpriteSource - спрайт-источник
'sprSpriteTarget  - спрайт-цель
'lngTrgTop       - позиция верхнего края в sprSriteTarget
'lngTrgLeft      - позиция левого края в sprSriteTarget

Dim sprAlphaSpriteOne As New SR2D_Sprite
Dim sprAlphaSpriteTwo As New SR2D_Sprite

'/инициализация буферов
sprAlphaSpriteOne.Init sprSpriteSource.Width, sprSpriteSource.Height
sprAlphaSpriteTwo.Init sprSpriteTarget.Width, sprSpriteTarget.Height
'\

sprSpriteTarget.Draw sprSpriteSource, lngTrgLeft, lngTrgTop, OpAlphaBlend 'отрисовывание цвета

sprAlphaSpriteOne.Draw sprSpriteSource, 0, 0, OpMoveByte, 3, 0 'получение альфы источника
sprAlphaSpriteTwo.Draw sprSpriteTarget, 0, 0, OpMoveByte, 3, 0 'получение альфы цели

sprAlphaSpriteTwo.Draw sprAlphaSpriteOne, 0, 0, OpAdd 'сложение алафа-каналов

sprSpriteTarget.Draw sprAlphaSpriteTwo, 0, 0, OpMoveByte, 0, 3 'отрисовывание альфа-канала

'/очистка буферов
Set sprAlphaSpriteOne = Nothing
Set sprAlphaSpriteTwo = Nothing
'\

End Function


П.С.: а надо ли это в функции?

Код: Выделить всё
'/очистка буферов
Set sprAlphaSpriteOne = Nothing
Set sprAlphaSpriteTwo = Nothing
'\



Добавлено: всё равно неправильно. Посмотрите свежим глазом, может найдёте, где косяк. Как будто альфу умножают саму на себя...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.07.2007 (Чт) 16:30

Crio
Тут нужна специальная ф-ция для суммирования изображений с альфаканалом, из имеющихся ее не составишь... в необходимости убедил, буду делать.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 12.07.2007 (Чт) 19:10

Может таким алгоритмом воспользоваться?

Попиксельный проход:
Код: Выделить всё
Смотрим альфа-канал цели.

Если альфа-канал равен нулю, то копируем RGBA источника в RGBA цели.

Если альфа-канал не равен нулю, то смешиваем RGB источника с RGB цели по алгоритму AlphaBlend.
Складываем альфа-каналы источника и цели.


Понимаю, RGB в итоге будет выглядеть неприглядно, как пятно с острыми краями, но это если смотреть его без альфы. А с альфой он будет выглядеть нормально.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.07.2007 (Пт) 9:11

Тут формула сложнее, эта будет искажать, и эту можно сымитировать и на имеющихся ф-циях.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 13.07.2007 (Пт) 12:03

А какой алгоритм ты будешь использовать?

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 14.07.2007 (Сб) 9:48

Алгоритм такой:
Код: Выделить всё
    a = Dst.a + (255 - Dst.a) * Src.a \ 255
    t = (255 - Src.a) * Dst.a \ 255
    Dst.r = (t * Dst.r + Src.r * Src.a) \ a
    Dst.g = (t * Dst.g + Src.g * Src.a) \ a
    Dst.b = (t * Dst.b + Src.b * Src.a) \ a
    Dst.a = a

Теперь думаю, как оптимальнее перевести это на асм.
Складываем альфа-каналы источника и цели

Не подходит, при суммировании двух полупрозрачных (50%) пикселей получится полностью непрозрачный, а должно быть на 75%.

Crio
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 84
Зарегистрирован: 21.05.2007 (Пн) 12:01
Откуда: Питер

Сообщение Crio » 16.07.2007 (Пн) 6:59

Алгоритм - :shock:
Это по каждому пикселю?

Про альфу.
Раньше думал, что если два слоя с альфой в 128 наложить, то будет полностью непрозрачное изображение... В фотошопе проверил, действительно - 75.
А это на практике выявлено, или у тебя справочные материалы имеются? Хочу себе небольшой ликбез устроить, раз уж лето такое.

Дай ссылку, пожалуйста...

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 16.07.2007 (Пн) 9:11

Нет у меня таких ссылок, это я просто включил логику, потом вспомнил математику.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 16.07.2007 (Пн) 15:40

Вот новый вариант:
http://tuapse-mikle.narod.ru/AC.rar
Здесь есть новый OpAlphaCombine, правда работает только для Draw, альфаспрайты нужно суммировать в порядке от дальнего к ближнему.
Часть ф-ций переведено на MMX, стало заметно быстрее. Добавлена ф-ция ARGB().
Как переведу все на MMX и сделаю OpAlphaCombine, OpMoveByte и OpMoveBit доступными из DrawMask, выложу обновление в "Кирпичи".

Пред.След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList