Как мне задать цвет отдельного пикселя в текстуре Direct3D?

StackOverflow https://stackoverflow.com/questions/818534

Вопрос

Я пытаюсь нарисовать 2D-изображение на экране в Direct3D, что, как я предполагаю, должно быть сделано путем сопоставления текстуры с прямоугольным многоугольником рекламного щита, спроецированным для заполнения экрана.(Мне не интересно или я не могу использовать Direct2D.) Вся информация о текстурах, которую я нашел в SDK, описывает загрузку растрового изображения из файла и назначение текстуры для использования этого растрового изображения, но я еще не нашел способа обрабатывать текстуру как растровое изображение попиксельно.

Чего бы мне действительно хотелось, так это такой функции, как

void TextureBitmap::SetBitmapPixel(int x, int y, DWORD color);

Если я не могу установить пиксели непосредственно в объекте текстуры, нужно ли мне хранить вокруг массива DWORD, который является растровым изображением, а затем назначать текстуру этому каждому кадру?

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

Спасибо.

Это было полезно?

Решение

Во-первых, ваш прямой вопрос:

Технически вы можете установить пиксели в текстуре.Это потребовало бы использования Исправить блокировку и Разблокировать правильно API.

В контексте D3D "блокировка" обычно относится к переносу ресурса из памяти графического процессора в системную память (тем самым отключая его участие в операциях рендеринга).После блокировки вы можете изменить заполненный буфер по своему усмотрению, а затем разблокировать, то есть передать измененные данные обратно на графический процессор.Обычно блокировка считалась очень дорогостоящей операцией, но поскольку PCIe 2.0 вероятно, это больше не является серьезной проблемой.Вы также можете указать небольшой (даже в 1 пиксель) прямоугольник в качестве второго аргумента для LockRect, тем самым требуя передачи в память незначительного объема данных, и надеяться, что драйвер действительно достаточно умен, чтобы передать именно это (я точно знаю, что в старых драйверах nVidia этого не было).

Более эффективный (и требующий много времени с кодом) способ достичь этого - действительно никогда не покидать графический процессор.Если вы создайте свою текстуру как RenderTarget (то есть укажите D3DUSAGE_RENDERTARGET в качестве его использование аргумент), затем вы могли бы установить его в качестве назначения конвейера перед выполнением каких-либо вызовов draw и написать шейдер (возможно передача параметров) чтобы раскрасить ваши пиксели.Такое использование целевых объектов рендеринга считается стандартным, и вы должны быть в состоянии найти множество примеров кода - но если вы уже не сталкиваетесь с проблемами производительности, я бы сказал, что это излишество для одного 2D-рекламного щита.

ХТХ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top