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

Ограничение PixelShader

Страницы: 1 2 3 Следующая »
#0
12:18, 21 мар. 2013

Использую 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 как текстурные координаты, что бы получить обводку?


#1
12:35, 21 мар. 2013

ronniko
> Я знаю как делать обводку объекта. Сначало рендерим в 1-м проходе чуть больший
> по размерам от оригинала силует 3д сетки , а затем во втором проходе рендерим
> сам оригинал и совмещаем. Получаем 3д объект с обводкой.

facepalm | Ограничение PixelShader
#2
12:41, 21 мар. 2013

ronniko
Ты посмотри внимательно примеры вершинных шейдеров, там можно передать кучу параметров в пиксельный. Если тебе нужно передать позицию в пиксельный, то это нужно делать через TEXCOORD. POSITION только один и он в пиксельный не идет.

И да, обводку персонажа вроде как можно сделать через depth map, что-то вроде метода edge detected. Но я не очень помню, почитай.

#3
12:58, 21 мар. 2013

TheGrayWolf
Ты знаешь какой то особенный способ ? Или просто решил потролиться, но как всегда неудачно.

#4
13:26, 21 мар. 2013

ronniko
Дак тебе обводка как в Cel(Toon) shading нужна? или что то другое? приведи скрин с конечным эфектом.

PS
пиксельный, с двумя позициями, это уже не смешно.

#5
13:33, 21 мар. 2013

TheGrayWolf

PS
пиксельный, с двумя позициями, это уже не смешно.

Не смешно. Но хочеться найти хитрые трюки , которые дадут нужный результат. Хочеться в один проход рендерить. :)

Cel(Toon) shading знаю. И есть рабочий пример.

#6
13:36, 21 мар. 2013

ronniko
приведи скрин (чужой) с конечным эфектом, обводки разные бывают.

#7
13:42, 21 мар. 2013

TheGrayWolf
Да там и приводить ни каких примеров не надо.
Представь Box(темный) а вокруг него белый силуэт. А на самом деле есть отрендренный Box чуть большего размера и второй Box чуть меньший, вот и все. И создаеться впечатление обводки.
Ни каких фильтров или выборок я не использую. Тупо делаю самый простой вариант.
Ведь по сути два бокса это одна и таже сетка. Так нафига 2 раза её рендерить, когда один раз мы в вершинном шейдере получили выходную 3д сетку Бокса, то нам нужна еще точно такая же 3д сетка только чуть меньших размеров.
Пример привел чисто для абстрактности. Что бы было яснее. А смысл моей темы именно в том, как в пиксельном шейдере сделать такое за 1 проход.

#8
13:45, 21 мар. 2013

ronniko
геометрические шейдеры должны помочь

#9
13:48, 21 мар. 2013

LuckyMan
Ты про тот же edge detect только в Geometry Shader?

#10
13:53, 21 мар. 2013

LuckyMan
> геометрические шейдеры должны помочь

Есть мнение, что чуть больше чем некак.

#11
13:57, 21 мар. 2013

ronniko
Маскируй стенциль, потом постпроцессом помоешь.

#12
14:01, 21 мар. 2013

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);
}

пойдет? Переписал быстро с готового шейдера, не придераться!

#13
14:01, 21 мар. 2013

TheGrayWolf
Может лучше к красной шапочке сходишь? :) Навестить.

#14
14:02, 21 мар. 2013

Osiris
Пиксельный шейдер в твоем примере даст 3д сетку белого цвета. Как то еще надо учесть TEXCOORD0 и 1

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

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