2009-05-04 2 views
4

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

То, что я бы очень хотел, такая функция, как

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

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

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

Спасибо.

ответ

4

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

Вы можете технически установить пиксели в текстуре. Для этого потребуется использовать API LockRect и UnlockRect.

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

Более эффективный (и с кодовым) способ достижения этого, действительно, никогда не покидать GPU. Если вы используете create your texture в качестве RenderTarget (то есть укажите D3DUSAGE_RENDERTARGET как свой аргумент usage), вы можете установить его как место назначения конвейера перед выполнением любых вызовов рисования и написать шейдер (возможно, passing parameters), чтобы нарисовать ваши пиксели. Такое использование целевых показателей рендеринга считается стандартным, и вы должны иметь возможность находить множество образцов кода, но если вы уже не сталкиваетесь с проблемами производительности, я бы сказал, что это избыток одного рекламного щита.

HTH.

Смежные вопросы