Использую Directx11 HLSL 4.0\5.0
Вобщем вопрос можно ли в пиксельный шейдер передать с вершинного шейдера две разных Position.
Сейчас обьясню. Я знаю как делать обводку объекта. Сначало рендерим в 1-м проходе чуть больший по размерам от оригинала силует 3д сетки , а затем во втором проходе рендерим сам оригинал и совмещаем. Получаем 3д объект с обводкой.
Теперь вопрос, можно ли за 1 проход сделать так:
1-е в вершинном шейдере выдаем out.Pos=mul (input.Pos,WorldViewProj); и out.Pos2=mul(input.Pos*1.25,WorldViewProj);
2-e в пиксельном шейдере вывести (я не имею в виду рендер в текстуру) Pos и Pos2.
Вобщем вершинный шейдер не создает ни каких проблем. И мы смело можем выдать out.Pos=mul (input.Pos,WorldViewProj); и out.Pos2=mul(input.Pos*1.25,WorldViewProj);
Но пиксельный шейдер не хочет работать с двумя Pos !
Можно ли обхетрить пиксельный шейдер и дать ему Pos2 как текстурные координаты, что бы получить обводку?
ronniko
> Я знаю как делать обводку объекта. Сначало рендерим в 1-м проходе чуть больший
> по размерам от оригинала силует 3д сетки , а затем во втором проходе рендерим
> сам оригинал и совмещаем. Получаем 3д объект с обводкой.
ronniko
Ты посмотри внимательно примеры вершинных шейдеров, там можно передать кучу параметров в пиксельный. Если тебе нужно передать позицию в пиксельный, то это нужно делать через TEXCOORD. POSITION только один и он в пиксельный не идет.
И да, обводку персонажа вроде как можно сделать через depth map, что-то вроде метода edge detected. Но я не очень помню, почитай.
TheGrayWolf
Ты знаешь какой то особенный способ ? Или просто решил потролиться, но как всегда неудачно.
ronniko
Дак тебе обводка как в Cel(Toon) shading нужна? или что то другое? приведи скрин с конечным эфектом.
PS
пиксельный, с двумя позициями, это уже не смешно.
TheGrayWolf
PS
пиксельный, с двумя позициями, это уже не смешно.
Не смешно. Но хочеться найти хитрые трюки , которые дадут нужный результат. Хочеться в один проход рендерить. :)
Cel(Toon) shading знаю. И есть рабочий пример.
ronniko
приведи скрин (чужой) с конечным эфектом, обводки разные бывают.
TheGrayWolf
Да там и приводить ни каких примеров не надо.
Представь Box(темный) а вокруг него белый силуэт. А на самом деле есть отрендренный Box чуть большего размера и второй Box чуть меньший, вот и все. И создаеться впечатление обводки.
Ни каких фильтров или выборок я не использую. Тупо делаю самый простой вариант.
Ведь по сути два бокса это одна и таже сетка. Так нафига 2 раза её рендерить, когда один раз мы в вершинном шейдере получили выходную 3д сетку Бокса, то нам нужна еще точно такая же 3д сетка только чуть меньших размеров.
Пример привел чисто для абстрактности. Что бы было яснее. А смысл моей темы именно в том, как в пиксельном шейдере сделать такое за 1 проход.
ronniko
геометрические шейдеры должны помочь
LuckyMan
Ты про тот же edge detect только в Geometry Shader?
LuckyMan
> геометрические шейдеры должны помочь
Есть мнение, что чуть больше чем некак.
ronniko
Маскируй стенциль, потом постпроцессом помоешь.
TheGrayWolf
Да пусть делает как хочет, чего ты пристал? Сферическая борьба за праведную разработку в вакууме? )
ronniko
//-------------------------------------------------------------------------------------- // Global variables //-------------------------------------------------------------------------------------- // matrixes float4x4 g_MatrixViewProj; float4x4 g_MatrixWorld; //-------------------------------------------------------------------------------------- // Structures //-------------------------------------------------------------------------------------- struct vertexInput { float3 position : POSITION; }; struct vertexOutput { float4 Position : POSITION; float3 Position1 : TEXCOORD0; float3 Position2 : TEXCOORD1; }; //-------------------------------------------------------------------------------------- // Samplers //-------------------------------------------------------------------------------------- //-------------------------------------------------------------------------------------- // Vertex shader //-------------------------------------------------------------------------------------- vertexOutput VS_Depth(vertexInput IN ) { vertexOutput OUT; // position in light camera space OUT.Position = mul( float4( IN.position.xyz , 1.0) , mul( g_MatrixWorld, g_MatrixViewProj ) ); // posotions OUT.Position1= OUT.Position.xyz; OUT.Position2= OUT.Position.xyz; return OUT; } //-------------------------------------------------------------------------------------- // Pixel shader //-------------------------------------------------------------------------------------- float4 PS_Depth( vertexOutput IN ) : COLOR { return float4( 1.0f, 1.0f, 1.0f, 1.0f); }
пойдет? Переписал быстро с готового шейдера, не придераться!
TheGrayWolf
Может лучше к красной шапочке сходишь? :) Навестить.
Osiris
Пиксельный шейдер в твоем примере даст 3д сетку белого цвета. Как то еще надо учесть TEXCOORD0 и 1
Тема в архиве.