Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.07.2015, 14:12   #1
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию Вернуть результат шейдера в приложение HLSL

Здравствуйте.
Есть такой шейдер:
Код:
// Описываем тип данных на входе вершинного шейдера
struct VertexShaderInput
{
    float4 position : POSITION;
};

// Описываем тип данных на входе пиксельного шейдера
struct PixelShaderInput
{
    float4 position : SV_POSITION;
};

float time : register(C0);
float4 mcol : register(C1);
float test;         <----------- нужно эту переменную прочитать в приложении. 

// Вершинный шейдер
// на входе вершина из буфера
// на выходе вершина обработанная, готовая для пиксельного шейдера
PixelShaderInput SimpleVertexShader( VertexShaderInput input )
{
    PixelShaderInput output = (PixelShaderInput)0;
    
    // не делаем с вершиной ничего
    output.position = input.position;
	float k = 0.5;
	output.position.x += k*sin(output.position.y + time);
	output.position.y += k*cos(output.position.x + time);
	
	test = 1256;  <----------  а тут нужно задать ей некое значение.
	
    return output;
}

// Пиксельный шейдер
// на входе вершина обработанная вершинным шейдером
// на выходе цвет результирующего пикселя, в виде RGBA
float4 RedPixelShader( PixelShaderInput input ) : SV_Target
{	
	float amount = sin(time) * 0.5 + 0.5; // amount will be in range [0..1]
	float4 color = lerp(float4(1,0,0,0), mcol, amount);
	return color;
}

// определяем последовательность шейдеров для нашего эффекта
technique10 SimpleRedRender
{
    // первый проход, он же последний
    pass P0
    {
        // устанавливаем вершинный шейдер с компиляцией под Shader Model 4.0
        SetVertexShader( CompileShader( vs_4_0, SimpleVertexShader() ) );

        // устанавливаем пиксельный шейдер с компиляцией под Shader Model 4.0
        SetPixelShader( CompileShader( ps_4_0, RedPixelShader() ) );
    }
}
пока это пробный вариант, но при компиляции шейдера получаю ошибку:
Код:
error X3025: global variables are implicitly constant, enable compatibility mode to allow modification
Так то вроде понятно что я объявил входные параметры, а вот как объявить выходной не ясно.
Пробовал разные метки ставить типа "shared" "uniform" и тд. Результат всегда одинаковый.

Пишу на SharpDX. Хотя видимо это не принципиально.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 10.07.2015, 19:55   #2
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Шейдеры так не работают. Там нет глобальных переменных в обычном смысле. Сами подумайте, код шейдера одновременно выполняют десятки потоков, не поддерживающих глобальную синхронизацию. Читать оттуда (ну, то есть не совсем оттуда) можно только текстуры, полученные в результате рендера в текстуру. А это не совсем то же самое что float-переменная... То есть, вы делаете текстуру, настраиваете render в неё, запускаете отрисовку, отрабатывает ваш шейдер, результат работы записывается в текстуру. Потом вы читаете текстуру.
Для более широкого спектра задач (где это нужно делать) есть OpenCL и CUDA.
Лучше объясните что вы пытаетесь сделать.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 10.07.2015, 20:54   #3
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

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

при желании test из вершинного шейдера можно передавать дальше по конвейеру через шейдерный интерфейс, и, в итоге, во фрагментном шейдере записать эту величину на выход.


uniform - это глобальная для шейдера констата, к которой из приложения есть только write access, а из шейдера - read-only
shared - бесполезная на мой взгляд вещь, для того чтобы нормально с ней работать нужна синхронизация, а с синхронизацией теряешь все бонусы параллельного выполнения

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

Последний раз редактировалось f.hump; 10.07.2015 в 21:41.
f.hump вне форума Ответить с цитированием
Старый 10.07.2015, 22:22   #4
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Цитата:
уже поддерживают, и имеют инструменты глобальной синхронизации
Можно источник?
Есть синхронизация в пределах блока, но это как бы не то совсем.
Занимаясь не так давно CUDA, могу сказать, что единственный способ сделать глобальную синхронизацию там - это запустить новое ядро. Сомневаюсь что для обычных шейдеров может существовать что-то лучше.
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 10.07.2015, 22:50   #5
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 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.
f.hump вне форума Ответить с цитированием
Старый 11.07.2015, 08:35   #6
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Да, про атомики я и забыл, тут вы правы.

Но насчет остального нет. Вот выдержка из GLSL 4.3:
Цитата:
A compute shader operates on a group of work items called a work group. A work group is a collection
of shader invocations that execute the same code, potentially in parallel. An invocation within a work
group may share data with other members of the same work group through shared variables and issue
memory and control barriers to synchronize with other members of the same work group.
То есть это не глобальный барьер, а именно в пределах рабочей группы. Аналог __syncthreads() в CUDA, насколько я понял. Видимо тот же механизм использован.

shared переменные - это опять же
Цитата:
The shared qualifier is used to declare variables that have storage shared between all work items
compute shader local work group
, то есть опять только в пределах группы.

Что до memory fences, в пункте 8.17 ко всем пунктам, кроме последнего написано что они работают только для транзакций в
Цитата:
single shader invocation.
Для последнего типа барьера (groupMemoryBarrier) написано
Цитата:
Control the ordering of all memory transactions issued within
a single shader invocation, as viewed by other invocations in
the same work group
- опять же только в пределах рабочей группы.

То есть вам это конечно подойдет если у вас только одна рабочая группа... Но так бывает редко.
Изобретатель велосипедов

Последний раз редактировалось Selestis; 11.07.2015 в 08:38.
Selestis вне форума Ответить с цитированием
Старый 11.07.2015, 13:08   #7
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

В сдк по directX есть пример DirectCompute. Там несколько примеров вычислений через шейдеры и возврат результатов в приложение.. однако у меня шейдеры не скомпилились ..
Позже посоветовали статью с исходниками там все расписано про RWStructuredBuffer которые можно заполнить в шейдере и вернуть в приложение.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 11.07.2015, 14:09   #8
Selestis
Форумчанин
 
Аватар для Selestis
 
Регистрация: 21.01.2009
Сообщений: 719
По умолчанию

Цитата:
однако у меня шейдеры не скомпилились ..
Может быть у вас недостаточно новая видеокарточка и не держит D3D11?
Вообще, хорошо бы узнать более подробное описание задачи...
Изобретатель велосипедов
Selestis вне форума Ответить с цитированием
Старый 11.07.2015, 15:14   #9
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от Selestis Посмотреть сообщение
Может быть у вас недостаточно новая видеокарточка и не держит D3D11?
Вообще, хорошо бы узнать более подробное описание задачи...
Карта GeForce 620.
Хабровский код нормально компилится и там я могу считать из шейдера массив. Однако осталось понять как привести полученный объект к нужному типу и будет гут.

А задача вроде и так в первом посте расписана .. вообще в целом есть большой 3д объект с большим количеством полигонов. Нужно быстро рассчитать сечение с определенной плоскость. Чтобы в реальном времени можно было изменять плоскость и сразу видеть сечение. Программный расчет не так быстро справляется с задачей. Хотел переложить на видяху.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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