Войти
ПрограммированиеФорумГрафика

Быстрейший способ перерисовки экрана попиксельно

Страницы: 1 2 3 Следующая »
#0
8:55, 7 дек. 2015

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

Пока что использую поверхности Direct3D9. Блокирую их методом Lock() и обрабатываю попиксельно, как элементы массива.
Раньше использовал поверхности DirectDraw7. Тот же метод.

Мне известно, что еще существует Direct2D, который, как я понимаю, заместил DirectDraw и GDI.
Кажется, он позволяет делать то же, что и два вышеописанных метода с DirectDraw и поверхностями Direct3D.
Не пробовал ли его кто-нибудь?

Другой подход мог бы заключаться в работе с битмапами вместо поверхностей всяких COM-объектов. Например TBitmap с доступом с помощью ScanLine().
Или FastDIB. Или многие другие битмапы с доступом к пикселям, как к линейному массиву. Потом копировать обработанный битмап с изображением в видеопамять для вывода.
Будет ли это быстрее, чем с поверхностями?

Слышал, что Direct Compute позволяет рисовать попиксельно, используя аппаратное ускорение, но нигде не могу найти книги по нему.

Если кто-то знает еще способы, пожалуйста, сообщите.


#1
9:05, 7 дек. 2015

Так для этого шейдеры и придумали.

#2
9:13, 7 дек. 2015

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

#3
9:58, 7 дек. 2015

Раз уж придётся все равно постигать GPU , почему бы не сделать все полноценно.
На компуте шейдер можно все , но так же есть общие ограничения те же что в вершинных программах, только можешь обрабатывать не один квант данных, и писать можешь произвольно в текстуру или просто массив в видеопамяти.

#4
10:27, 7 дек. 2015

Mira

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

Вот я и раздумываю, не попытаться ли воспользоваться аппаратным параллелизмом compute shader и стоит ли это потраченного на его изучение времени.
Вдруг окажется, что никакого ускорения по сравнению с поверхностями я не получу?
Можно еще, в принципе, CUDA попытаться приспособить для ускорения вместо шейдера, но то же разбираться с ней много.
OpenCV тоже, может быть, можно использовать для моих целей.
Или, может быть, есть другой способ, не требующий изучения шейдеров, больше похожий на то, что я сейчас делаю?

#5
10:56, 7 дек. 2015

Ciaphas
> Шейдеры не позволяют вывести в произвольном пикселе экрана произвольный цвет
зато позволяют обработать каждый пиксель экрана и вывести для него произвольный цвет рассчитанный твоим алгоритмом, разве тебе не это нужно?

#6
11:45, 7 дек. 2015

Ciaphas
Однозначно это полезно. Вот то что делаещ сейчас - на практике бесполезно, разве для удовольствия.
Произвольный доступ никогда не будет сравним по скорости с потоковым ибо вся архитектура CPU,GPU , памяти итд заточена пол потоковую ( последовательную) работу.

Будет разумнее тебе подстроиться под эту модель , и вычислять цвет пикесля налету на основании комплекса данных.
Самое неинтересное что придётся вникать в векторную/матричную математику и всякие формулы типа расчёта освещения .

#7
12:18, 7 дек. 2015

Ciaphas самый быстрый это юзать ComputeShader. Без Pixel\Vertex шейдеров.
Легко выводить 2д текстуры, точки. И очень быстро.
У меня текстура 256х256 выводилась 9000 раз в секунду !
Разрешение экрана 1680х1050.
Intel I5-2320 и Radeon 7950.


PS: ComputeShader только для видеокарт с подержкой Directx 11 :(

#8
12:20, 7 дек. 2015

ronniko
Как ты её в экран рисовал? Компут шейдер разве может сразу в экран :)

#9
12:33, 7 дек. 2015

Mira

Компут шейдер разве может сразу в экран

Да , может.
Я серьезно, без подколов.
#10
12:46, 7 дек. 2015

ronniko
Ну норм. Я не юзал но читал что он может заменять весь конвейер.

#11
12:47, 7 дек. 2015

Aroch

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

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


Mira

Самое неинтересное что придётся вникать в векторную/матричную математику и всякие формулы типа расчёта освещения.

Я в нее вник, когда мех-мат закончил 10 лет назад.
Для алгоритма расчета отсечения лучей все эти матрицы не нужны. Не собираюсь их для него приспосабливать.
Для расчета освещения достаточно закона Ламберта и рассеянного освещения. Можно еще зеркальность добавить для некоторых поверхностей.

Мне просто нужен быстрый доступ к пикселям и доп. счетные мощности, которые мне может дать GPU.
Я бы поэтому предпочел не использовать шейдеры, а просто использовать GPU, как параллельный CPU. Поэтому и думаю в строну CUDA и подобных инструментов.

#12
12:55, 7 дек. 2015

ronniko

Ciaphas самый быстрый это юзать ComputeShader. Без Pixel\Vertex шейдеров.
Легко выводить 2д текстуры, точки. И очень быстро.
У меня текстура 256х256 выводилась 9000 раз в секунду !

А текстуру ты выводил поточечно, копируя на экран с текстуры, или всю одним махом какой-нибудь операцией типа блитирования?
Если поточечно, то это все, что мне нужно. Скорость великолепная, даже если я ее в сто раз просажу.
Где взять вразумительное руководство по compute shader'у с примерами?
Примеры всяких фильтров на нем я видел. Его обычно для постпроцессинга употребляют потому что, или для обработки изображений аля Фотошоп.
Нужны примеры именно закраски экрана произвольными пикселями с текстуры.
#13
13:17, 7 дек. 2015

Одним махом.

void CS( uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex )
TexInput[int2(DTid.x-90,DTid.y-90)];
//DTid.x и DTid.y это экранные координаты как Integer число.

Но можно изменить цвет текстуры или эффекты добавить к текстуре, сетку(сетка не текстура !).
Вот такой например. И при этом все равно высокий ФПС.
com | Быстрейший способ перерисовки экрана попиксельно

#14
14:48, 7 дек. 2015

ronniko

Одним махом.

((((((((
Одним махом можно и с помощью GDI битмап вывести сотни раз в секунду, хотя, может быть и не тысячи.
Все пакеты позволяют быстро копировать на экран или с поверхности на поверхность битмапы, как целое, используя аппаратное ускорение.
А когда начинаешь работать попиксельно, то скорость падает в десятки раз, так как эта операция совершается другими функциями.

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

Страницы: 1 2 3 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.