Шейдеры

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Шейдеры

Сообщение FireFenix » 11.01.2009 (Вс) 20:25

Код: Выделить всё
// Shader output, position and diffuse color
struct VS_OUTPUT
{
    float4 pos  : POSITION;
    float4 diff : COLOR0;
};
// The world view and projection matrices
float4x4 WorldViewProj : WORLDVIEWPROJECTION;
float Time = 1.0f;
// Transform our coordinates into world space
VS_OUTPUT Transform(float4 Pos  : POSITION)
{
    // Declare our return variable
    VS_OUTPUT Out = (VS_OUTPUT)0;
    // Transform our position
    Out.pos = mul(Pos, WorldViewProj);
    // Set our color
    Out.diff.r = 1 - Time;
    Out.diff.b = Time * WorldViewProj[2].yz;
    Out.diff.ga = Time * WorldViewProj[0].xy;

    return Out;
}

technique TransformDiffuse
{
    pass P0
    {
        CullMode = None;

        // shaders
        VertexShader = compile vs_1_1 Transform();
        PixelShader  = NULL;
    }
}


пытаясь разобратьшейдер.... наткнулся на Out.diff.b = Time * WorldViewProj[2].yz;
т.е. по моим соображениям он присваивает diff.b 2х мерную матрицу, что впринципе невозможно т.к. diff.b - байт синего цвета
или я не правильно понял как работает..... Но зараза шейдер отрабатывает своё...

помогите разобраться!

P.S. Никто ненает как посмотреть промежуточные значения шейдера или чем дебажить можно?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры

Сообщение Mikle » 12.01.2009 (Пн) 11:24

как посмотреть промежуточные значения шейдера

Выводи их в какой-нибудь неиспользуемый выходной регистр, например в спекуляр, и смотри на выходе шейдера.
Вообще я в HSLS не силен, а в asm шейдерах обычно все не так, наример v0.xy обозначает v0.xyyy, то есть вместо "zw" подставляется "y".

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Шейдеры

Сообщение DirectXManiac » 13.01.2009 (Вт) 2:29

float4 diff - ты определяешь diff как 4х мерный вектор, значит diff.b у тебя float.
Никакую матрицу ты не присваиваешь у просто умножаешь Time на первые два элемента столбца заданного в [].
Вообще такое я вижу первый раз. Незнаю как оно работает, скорее всего происходит умножение Time на каждую из координат и произведения складываются, или вообще вторая координата отбрасывается. Чесно говоря не в курсе. А для чего шейдер вообще? Какой эффект хочешь получить?
#define ROFL 0xDDDD

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 13.01.2009 (Вт) 11:53

Ну вобщем это первый шейдер из мануала Managed DirectX Тома Миллера...
Шейдер в зависимости от времени и места расположения меняет цвет вершин треугольника....
На выходе - врщающийся треугольник по 3м координатам и меняющий произвольно цвет
т.е. Out.diff.b - мы записываем синий цвет
т.к. Out.diff это float4 => Out.diff.b это не вектор, а как говорится в мануале Proj[2].xy должен образовывать вектор (x,y) поэтому присваивать float значение float2, как-то непонятно...
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Шейдеры

Сообщение DirectXManiac » 14.01.2009 (Ср) 0:33

Я не уверен, но как сказал выше умножение происходит покоординатно и произведения складываются. Возможно находится длина вектора float2 и умножается на Time.
Вообще я вот что посоветую. Не стоит заморачиваться на таких шейдерах. Где ты сможешь применить его? Думаю врядле найдется оправданное применение. Я начинал с простого - простой рендер объекта, инверсия цветов текстуры, черно белая текстура, потом делал освещение всех видов, ну а потом уже и бамп и шадоу мапы и все прочее. Начни например со статьи на Gamedev.ru - очень полезная статья про шейдеры, именно про HLSL
http://www.gamedev.ru/articles/?id=10109
Попробуй сделать то же на Managed и будет тебе счастье и знание шейдеров подымешь и разберешся что к чему, и как что делается.
Удачи!
#define ROFL 0xDDDD

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Re: Шейдеры

Сообщение Ktulhu » 14.01.2009 (Ср) 1:49

http://www.riemers.net/
тоже хороший ресурс. я в шейдерах по нему очень быстро разобрался

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 16.01.2009 (Пт) 16:57

Mikle писал(а):
как посмотреть промежуточные значения шейдера

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


А можно работающий примерчег в виде кусочка кода или исходничка?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 20.01.2009 (Вт) 20:25

Везде информация о directx sdk либо на англицом не полном, либо на японском, что ваще не понятно....
так и не нашёл как принимать из шейдера.... может кто-нить сжалится?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Шейдеры

Сообщение DirectXManiac » 21.01.2009 (Ср) 11:02

Поищи различные программы для работы со шейдерами. Помойму FX Composer может смотреть дебаг значения шейдера.
#define ROFL 0xDDDD

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры

Сообщение Mikle » 21.01.2009 (Ср) 17:58

FireFenix
Значения из вертексного шейдера принимает пиксельный шейдер. Строго говоря, это не совсем так, но сейчас это не важно.
Поставь вместо пиксельного шейдера обычные TSS:
SetTSS 0, ColorOp, SelectArg1
SetTSS 0, ColorArg1, Specular
SetTSS 1, ColorOp, Disabled

и вот ты видишь то, что вертексный шейдер выводит в Specular (регистр oD1).
Чтобы посмотреть текстурные координаты, тут уже TSS не спасут, пишешь пиксельный шейдер. Но можно без этого обойтись - в вертексном шейдере ВРЕМЕННО подставь после
mov oT0, .....
такой же mov для спекуляра:
mov oD1, .....

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 22.01.2009 (Чт) 17:03

хммм...... тут понятно, но у меня ещё возникает нехорошее чувство....
у ДХ СДК есть типа Effect.SetValue и есть Effect.GetValue, Effect.GetFloat и т.д.
пытался через них и не раз, ловлюсь на том что всегда возвращает 0. Они же поидее должны работать для всех шейдеров? или по крайнемерее которые работают...

Mikle, и вот твой вывод через vs -> ps, а как потом получить в бейсике? ибо через принцип описанный выше не робит =\
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 22.01.2009 (Чт) 17:07

DirectXManiac писал(а):Поищи различные программы для работы со шейдерами. Помойму FX Composer может смотреть дебаг значения шейдера.


это понятно, что через сторонние программы можно..... но если скажем чтобы ускорить матчасть мне нада вычеслять в шейдере? тогда нада обратно получать...... или мне нада протестировать выходные данные для конкретного случая, а ведь каждый раз менять шейдеры в фх компосерре не выход
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Ktulhu
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 132
Зарегистрирован: 14.07.2007 (Сб) 14:03
Откуда: Киев, Р'льех

Re: Шейдеры

Сообщение Ktulhu » 22.01.2009 (Чт) 23:17

вроде как чтение из памяти видеокарты - трудноватая операция

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Шейдеры

Сообщение DirectXManiac » 22.01.2009 (Чт) 23:57

Что? Ускорить мат часть? Не думай даже ускорять вычисления с помощью шейдера! Шейдер должен считать только то что касается вершин/цветов соответственно, а вычисления нужно проводить без его участия, на то он и шейдер. Ну и интересно каким образом ты решил что либо ускорять в общих вычеслениях, если ты итак скорость снимаешь передачей/получаением параметров... Это не выход. То что ты передаешь в шейдер вытаскиватся не должно никогда. А получать значения нужно исключительно для отладки!
#define ROFL 0xDDDD

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 23.01.2009 (Пт) 15:23

DirectXManiac писал(а):Что? Ускорить мат часть? Не думай даже ускорять вычисления с помощью шейдера! Шейдер должен считать только то что касается вершин/цветов соответственно, а вычисления нужно проводить без его участия, на то он и шейдер. Ну и интересно каким образом ты решил что либо ускорять в общих вычеслениях, если ты итак скорость снимаешь передачей/получаением параметров... Это не выход. То что ты передаешь в шейдер вытаскиватся не должно никогда. А получать значения нужно исключительно для отладки!


ну ок, мат часть проехали.... но один фиг я немогу вытащить из этого "хорошего" шейдера переменную :cry: ......
как вариант с мат частью - Nvida Cuda.... оно же как-то использует ГПУ?
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Шейдеры

Сообщение DirectXManiac » 24.01.2009 (Сб) 0:40

Не знаю не видел, как они там делают. Нет, ну если скажем физику или что то вроде, теоретически возможно использовать шейдеры... Но 2.0 точно не хватит. Для ускорения вычислений нужно как минимум 4.0)))
#define ROFL 0xDDDD

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 24.01.2009 (Сб) 1:30

Один фиг я из него вытянуть обработанные данные немогу........ бррррр......
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Re: Шейдеры

Сообщение DirectXManiac » 25.01.2009 (Вс) 22:46

Информацию тебе дали... www.google.com, www.gamedev.ru - ищи, разбирайся, спрашивай там... Source Code тебе врядле кто то даст, да и программу писать тоже врядле кто будет)
#define ROFL 0xDDDD

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры

Сообщение Mikle » 26.01.2009 (Пн) 11:23

FireFenix писал(а):вытянуть обработанные данные

Что это значит? Куда их "вытягивать"?

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Шейдеры

Сообщение FireFenix » 11.04.2009 (Сб) 22:44

Mikle писал(а):
FireFenix писал(а):вытянуть обработанные данные

Что это значит? Куда их "вытягивать"?

Сори что поднимаю старый топег, но решения ненашёл.......
нашёл варианты в виде R2VB, StreamOut, Computing Shader, nVidia CUDA, ATI Stream, OpenCL, но нормальной рабочей реализации или примерчика нету =\

вытягивать всмысле, скажем как посотреть результат Out.diff.b = Time * WorldViewProj[2].yz;
т.е. просто из любопытства я хочу посотреть что записалось в Out.diff.b и вывести в форму значение, т.к. незнаю что делает конструкция
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Шейдеры

Сообщение Mikle » 12.04.2009 (Вс) 12:38

Вообще я с HLSL не знаком, привык к Asm шейдерам. Но по логике Out.diff.b - это компонента Blue диффузного цвета регистра oD0, то есть oD0.b. И их будет ровно столько, сколько вертексов ты скормил шейдеру на обработку. Чтобы посмотреть, что там лежит, нужно отрендерить вертексы, используя вместо пиксельного шейдера:

SetTextureStageState,0,ColorOp,SelectArg1
SetTextureStageState,0,ColorArg1,Diffuse
SetTextureStageState,1,ColorOp,Disabled

, локнуть BackBuffer, взять оттуда данные в массив, вычислить координаты, где расположен нужный вертекс, взять из массива это значение и выделить компоненты Blue. Еще при этом желательно убедиться, что искомый вертекс не оказался перекрыт другой геометрией.


Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList