Помощь - Поиск - Пользователи - Календарь
Полная версия: Работа с "графикой"
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Assembler
Account
Поставлена вот такая задача:
Нарисовать 8 разноцветных полос (не линий) во весь экран, режим например использовать 640х350 параллельных главной диагонали.

Пример результата в прикрепленной картинке
IUnknown
Вот так:
Нажмите для просмотра прикрепленного файла
(по непонятной причине ASM-файл загружаться отказался. Странно, почему PAS можно, и CPP можно, а ASM-нельзя)

Но задача решена "в лоб", с выводом напрямую в видеопамять в этом режиме заморачиваться не очень хочется, поэтому вывод сделан через BIOS, откуда и быстродействие: ниже плинтуса, тем более, что запускалось это всё в эмуляторе. Хочешь - измени вывод пиксела на запись в видеопамять - будет на порядок (если не на 2) быстрей. Картинка получается очень похожая на ту, что ты показал... Да, там можно, разумеется, код еще подшлифовать, но пока я этого делать не стал...
IUnknown
Похоже, эта тема интересна мне одному, но оставить недоделанным это задание я не мог. Вот версия, которая пишет напрямую в видеопамять.
Нажмите для просмотра прикрепленного файла

Работает гораздо быстрее, чем предыдущая. Компилировалось TASM 3.0 :
>tasm lines8v.asm
>tlink lines8v.obj

Account
Цитата(IUnknown @ 13.10.2011 13:10) *

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


Ну как это, не только тебе одному (свой скромный результат я тебе показывал). Мне она тоже интересна, просто я пока не смог разобраться с прямым выводом в видеопамять в графическом режиме, знаний мало и способности видимо нет. Так же голова забита о предстоящей в скором времени сессии, предпоследней перед Дипломным проектом, в поиске темы для которого я сейчас так же нахожусь.(((

Остальное в приват отправил.
IUnknown
Значит, по поводу артефактов...

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

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

Что касается правого нижнего угла - это вообще для меня загадка, я уже ограничил входные данные в процедуре ScanLine, теперь физически линия не может заходить на предыдущую/последующую строки (а очень похоже на то, что где-то все-таки происходит выход за пределы 0 .. 639 и пиксель уходит на соседнюю строку). Прогнал несколько раз в отладчике - не вижу, где проблема (то есть, время возникновения - как раз увидел, эта фигня проявляется, когда рисуется нижняя часть малиновых штановой полосы, но опять же, как с этим бороться - пока без понятия). Найду - напишу. Может, еще кто посмотрит и найдет что не так...
Account
Цитата(IUnknown @ 13.10.2011 18:15) *

Значит, по поводу артефактов...

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

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

Что касается правого нижнего угла - это вообще для меня загадка, я уже ограничил входные данные в процедуре ScanLine, теперь физически линия не может заходить на предыдущую/последующую строки (а очень похоже на то, что где-то все-таки происходит выход за пределы 0 .. 639 и пиксель уходит на соседнюю строку). Прогнал несколько раз в отладчике - не вижу, где проблема (то есть, время возникновения - как раз увидел, эта фигня проявляется, когда рисуется нижняя часть малиновых штановой полосы, но опять же, как с этим бороться - пока без понятия). Найду - напишу. Может, еще кто посмотрит и найдет что не так...


По поводу ступенчатости. Я понимаю что от нее не деться. Я там обвел только в одном месте что то слишком торчало))
Далее, верхний левый угол, такое ощущение что не с 0-го пикселя (по оси Y) начинало рисовать, я стрелочкой показал. При том что это только на первой полоске от главной диагонали почему то.

//-----------------------------------------------------

Посмотрел последнюю версию. Все шикарно и быстро. Только уголок остался.))
Цитата(IUnknown @ 13.10.2011 18:15) *

Может, еще кто посмотрит и найдет что не так...


Честно, гложет большое сомнение, что кто то захочет копаться в чужом коде на данном языке). Но время покажет, может и ошибаюсь...
TarasBer
Цитата(IUnknown @ 13.10.2011 13:10) *

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


Париться с "удобным" устройством видеопамяти в 640х350 мало кому интересно. Возни много, а толку? 320х200, 256 цветов намного интереснее.
IUnknown
Надо ж было так ошибиться... Account, исправь (строка 494):

	; Рисуем пиксели из конечного неполного байта
mov al, [di] ; <--- Вот тут было mov AX, [di]
stosb

, я ж говорил, что проблема - с замыкающим байтом...
Account
Цитата(IUnknown @ 14.10.2011 14:02) *

Надо ж было так ошибиться... Account, исправь (строка 494):

	; Рисуем пиксели из конечного неполного байта
mov al, [di] ; <--- Вот тут было mov AX, [di]
stosb

, я ж говорил, что проблема - с замыкающим байтом...


От ошибок никто не застрахован, особенно в этом языке.

Подправил, проверил. Ну что тут можно сказать, супер, быстро и красиво. А ты как всегда на высоте.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.