|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.07.2015, 14:12 | #1 |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Вернуть результат шейдера в приложение HLSL
Здравствуйте.
Есть такой шейдер: Код:
Код:
Пробовал разные метки ставить типа "shared" "uniform" и тд. Результат всегда одинаковый. Пишу на SharpDX. Хотя видимо это не принципиально.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
10.07.2015, 19:55 | #2 |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
Шейдеры так не работают. Там нет глобальных переменных в обычном смысле. Сами подумайте, код шейдера одновременно выполняют десятки потоков, не поддерживающих глобальную синхронизацию. Читать оттуда (ну, то есть не совсем оттуда) можно только текстуры, полученные в результате рендера в текстуру. А это не совсем то же самое что float-переменная... То есть, вы делаете текстуру, настраиваете render в неё, запускаете отрисовку, отрабатывает ваш шейдер, результат работы записывается в текстуру. Потом вы читаете текстуру.
Для более широкого спектра задач (где это нужно делать) есть OpenCL и CUDA. Лучше объясните что вы пытаетесь сделать.
Изобретатель велосипедов
|
10.07.2015, 20:54 | #3 | |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
в целом, будучи знакомым с GLSL, конвейер устроен таким образом, что из приложения можно прочитать только результат выполнения фрагментного шейдера, все остальные стадии конвейера не меняют состояния фреймбуферов.
при желании test из вершинного шейдера можно передавать дальше по конвейеру через шейдерный интерфейс, и, в итоге, во фрагментном шейдере записать эту величину на выход. uniform - это глобальная для шейдера констата, к которой из приложения есть только write access, а из шейдера - read-only shared - бесполезная на мой взгляд вещь, для того чтобы нормально с ней работать нужна синхронизация, а с синхронизацией теряешь все бонусы параллельного выполнения Цитата:
Последний раз редактировалось f.hump; 10.07.2015 в 21:41. |
|
10.07.2015, 22:22 | #4 | |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
Цитата:
Есть синхронизация в пределах блока, но это как бы не то совсем. Занимаясь не так давно CUDA, могу сказать, что единственный способ сделать глобальную синхронизацию там - это запустить новое ядро. Сомневаюсь что для обычных шейдеров может существовать что-то лучше.
Изобретатель велосипедов
|
|
10.07.2015, 22:50 | #5 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
я это прочитал в мануале "The OpenGL® Shading Language" version 4.30 3-Aug-2012.
добавлены атомные операции (atomic operations), которые позволяют сериализовать доступ к общим переменным. барьеры (barrier), которые позволяют блокировать выполнение шейдера до тех пор пока все активные инстансы одного шейдера не достигнут того же барьера. плюс фенсы на память (memory barriers) Последний раз редактировалось f.hump; 10.07.2015 в 22:52. |
11.07.2015, 08:35 | #6 | ||||
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
Да, про атомики я и забыл, тут вы правы.
Но насчет остального нет. Вот выдержка из GLSL 4.3: Цитата:
shared переменные - это опять же Цитата:
Что до memory fences, в пункте 8.17 ко всем пунктам, кроме последнего написано что они работают только для транзакций в Цитата:
Цитата:
То есть вам это конечно подойдет если у вас только одна рабочая группа... Но так бывает редко.
Изобретатель велосипедов
Последний раз редактировалось Selestis; 11.07.2015 в 08:38. |
||||
11.07.2015, 13:08 | #7 |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
В сдк по directX есть пример DirectCompute. Там несколько примеров вычислений через шейдеры и возврат результатов в приложение.. однако у меня шейдеры не скомпилились ..
Позже посоветовали статью с исходниками там все расписано про RWStructuredBuffer которые можно заполнить в шейдере и вернуть в приложение.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
11.07.2015, 14:09 | #8 | |
Форумчанин
Регистрация: 21.01.2009
Сообщений: 719
|
Цитата:
Вообще, хорошо бы узнать более подробное описание задачи...
Изобретатель велосипедов
|
|
11.07.2015, 15:14 | #9 | |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Цитата:
Хабровский код нормально компилится и там я могу считать из шейдера массив. Однако осталось понять как привести полученный объект к нужному типу и будет гут. А задача вроде и так в первом посте расписана .. вообще в целом есть большой 3д объект с большим количеством полигонов. Нужно быстро рассчитать сечение с определенной плоскость. Чтобы в реальном времени можно было изменять плоскость и сразу видеть сечение. Программный расчет не так быстро справляется с задачей. Хотел переложить на видяху.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
OpenGL4.3 в Qt5.4 - передача значения в uniform переменную вершинного шейдера. | wf778899 | Qt и кроссплатформенное программирование С/С++ | 5 | 18.03.2015 21:41 |
вернуть результат деленный на тысячу | SAMOUCHKA | SQL, базы данных | 8 | 24.02.2014 14:07 |
XNA & HLSL | Inv1s | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 2 | 26.10.2012 11:14 |
BitmapEffects -> HLSL, Shaders | BOBAH13 | Общие вопросы .NET | 0 | 31.10.2010 23:23 |