Рисование пиксель за пикселем в C++

Несколько лет назад я программировал для MS-DOS на ассемблере. Одна из доступных вещей заключалась в том, чтобы сообщить BIOS координату x, координату y и цвет (выраженный в виде целого числа), затем вызвать функцию, и BIOS немедленно сделает это.

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

Я много лет пытался писать в MacOS API, но обнаружил, что это сложно или невозможно, поскольку вообще ничего не задокументировано. (Что, черт возьми, такое NSNumber? Почему все элементы управления возвращают бесполезный объект?)

На самом деле у меня сейчас нет никаких конкретных проектов, но я хотел бы иметь возможность писать на C++, который может рисовать пиксели во многом таким же образом. Может, я сумасшедший, но мне нужен такой контроль.

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

В наши дни вам, скорее всего, потребуется использовать opengl или какой-либо другой api, потому что современные ОС обычно не позволяют писать напрямую в графический процессор (ну, если вы не пишете драйвер устройства, но это лучше оставить производителю графического процессора.

drescherjm 02.07.2018 19:54

Мой совет - изучить структуру графического интерфейса, такую ​​как Qt или, возможно, что-то вроде sfml.

drescherjm 02.07.2018 19:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
10 415
2

Ответы 2

Современные операционные системы x86 больше не работают под реальный режим.

У вас есть несколько вариантов:

  1. Запустите виртуальную машину и установите ОС реального режима (например, MS-DOS).

  2. Используйте слой, имитирующий реальный режим (например, DOSBox).

  3. Используйте библиотеку графического интерфейса (например, Qt, GTK, wxWidgets, Win32, X11) и используйте холст или аналогичный элемент управления, где вы можете рисовать.

  4. Используйте 2D-API (например, 2D-компоненты SDL, SFML, Allegro).

  5. Используйте 3D API (например, OpenGL, Direct3D, Vulkan, Metal; возможно, предоставленный SDL, SFML или Allegro, если вы хотите его переносить) для потоковой передачи текстуры, которую вы заполнили пикселем за пикселем с процессором в каждом кадре.

  6. Пишите фрагментные шейдеры (либо с помощью 3D API, либо, что гораздо проще, в веб-приложении с помощью WebGL).

Если вы хотите узнать, как на самом деле делается графика в наши дни, вам следует выбрать последние 2 варианта.

Обратите внимание: если вам нравится рисовать «пиксель за пикселем», вы, вероятно, будете писать фрагментные шейдеры прямо на GPU и любовь писать все удивительные эффекты, которых можно достичь с их помощью. См. Некоторые примеры в ShaderToy!

Вы можете попробовать использовать Windows GDI:

#include <windows.h>

int main()
{
    HDC hdc = GetDC(GetConsoleWindow());
    for (int x = 0; x < 256; ++x)
        for (int y = 0; y < 256; ++y)
            SetPixel(hdc, x, y, RGB(127, x, y));
}

Нарисовать что-то довольно легко (если это то, о чем вы спрашиваете), как вы могли видеть из приведенного выше примера.

Другие вопросы по теме