Форум «Всё о Паскале» _ Assembler _ Работа с "графикой"
Автор: Account 7.10.2011 21:47
Поставлена вот такая задача: Нарисовать 8 разноцветных полос (не линий) во весь экран, режим например использовать 640х350 параллельных главной диагонали.
Пример результата в прикрепленной картинке
Эскизы прикрепленных изображений
Автор: IUnknown 10.10.2011 20:57
Вот так: lines5.zip ( 1.04 килобайт )
Кол-во скачиваний: 726
(по непонятной причине ASM-файл загружаться отказался. Странно, почему PAS можно, и CPP можно, а ASM-нельзя)
Но задача решена "в лоб", с выводом напрямую в видеопамять в этом режиме заморачиваться не очень хочется, поэтому вывод сделан через BIOS, откуда и быстродействие: ниже плинтуса, тем более, что запускалось это всё в эмуляторе. Хочешь - измени вывод пиксела на запись в видеопамять - будет на порядок (если не на 2) быстрей. Картинка получается очень похожая на ту, что ты показал... Да, там можно, разумеется, код еще подшлифовать, но пока я этого делать не стал...
Автор: IUnknown 13.10.2011 12:10
Похоже, эта тема интересна мне одному, но оставить недоделанным это задание я не мог. Вот версия, которая пишет напрямую в видеопамять. lines8v.zip ( 3.75 килобайт )
Кол-во скачиваний: 737
Работает гораздо быстрее, чем предыдущая. Компилировалось TASM 3.0 :
>tasm lines8v.asm >tlink lines8v.obj
Автор: Account 13.10.2011 14:05
Цитата(IUnknown @ 13.10.2011 13:10)
Похоже, эта тема интересна мне одному, но оставить недоделанным это задание я не мог. Вот версия, которая пишет напрямую в видеопамять.
Ну как это, не только тебе одному (свой скромный результат я тебе показывал). Мне она тоже интересна, просто я пока не смог разобраться с прямым выводом в видеопамять в графическом режиме, знаний мало и способности видимо нет. Так же голова забита о предстоящей в скором времени сессии, предпоследней перед Дипломным проектом, в поиске темы для которого я сейчас так же нахожусь.(((
Остальное в приват отправил.
Автор: IUnknown 13.10.2011 17:15
Значит, по поводу артефактов...
Большую часть убрал, со ступенчатостью, извини, сделать ничего не могу, это все-таки не горизонтальные/вертикальные, а диагональные линии, причем соотношение сторон в этом граф. режиме тоже не самое благоприятное.
Касаемо черных точек, проскакивающих в некоторых местах - еще раз проверил всю работу с битами в начальном/конечном неполных байтах (уверен, проблема - именно там, какой-нибудь бит маски неправильно выставляется, или что-то в этом роде, отсюда и "битый пиксель", опять же - заметил, что появляются эти черные только на стыках разных цветов, а не в середине?). Пока ничего некорректного в коде найти не могу, потом еще покопаюсь.
Что касается правого нижнего угла - это вообще для меня загадка, я уже ограничил входные данные в процедуре ScanLine, теперь физически линия не может заходить на предыдущую/последующую строки (а очень похоже на то, что где-то все-таки происходит выход за пределы 0 .. 639 и пиксель уходит на соседнюю строку). Прогнал несколько раз в отладчике - не вижу, где проблема (то есть, время возникновения - как раз увидел, эта фигня проявляется, когда рисуется нижняя часть малиновых штановой полосы, но опять же, как с этим бороться - пока без понятия). Найду - напишу. Может, еще кто посмотрит и найдет что не так...
Большую часть убрал, со ступенчатостью, извини, сделать ничего не могу, это все-таки не горизонтальные/вертикальные, а диагональные линии, причем соотношение сторон в этом граф. режиме тоже не самое благоприятное.
Касаемо черных точек, проскакивающих в некоторых местах - еще раз проверил всю работу с битами в начальном/конечном неполных байтах (уверен, проблема - именно там, какой-нибудь бит маски неправильно выставляется, или что-то в этом роде, отсюда и "битый пиксель", опять же - заметил, что появляются эти черные только на стыках разных цветов, а не в середине?). Пока ничего некорректного в коде найти не могу, потом еще покопаюсь.
Что касается правого нижнего угла - это вообще для меня загадка, я уже ограничил входные данные в процедуре ScanLine, теперь физически линия не может заходить на предыдущую/последующую строки (а очень похоже на то, что где-то все-таки происходит выход за пределы 0 .. 639 и пиксель уходит на соседнюю строку). Прогнал несколько раз в отладчике - не вижу, где проблема (то есть, время возникновения - как раз увидел, эта фигня проявляется, когда рисуется нижняя часть малиновых штановой полосы, но опять же, как с этим бороться - пока без понятия). Найду - напишу. Может, еще кто посмотрит и найдет что не так...
По поводу ступенчатости. Я понимаю что от нее не деться. Я там обвел только в одном месте что то слишком торчало)) Далее, верхний левый угол, такое ощущение что не с 0-го пикселя (по оси Y) начинало рисовать, я стрелочкой показал. При том что это только на первой полоске от главной диагонали почему то.