Quest3D - Русскоязычное сообщество

Quest3D => Визуализация, Шейдеры => Тема начата: mkone112 от 18 Августа 2010, 02:18:44



Название: [sh] смещение вершины через шейдер hlsl
Отправлено: mkone112 от 18 Августа 2010, 02:18:44
Как в шейдере анимировать одну отдельную конкретную вершину чтоб она постоянно двигалась "туда-сюда".


Название: Re: смещение вершины через шейдер hlsl
Отправлено: Sqwer от 18 Августа 2010, 14:27:53
Красим вершины модели  в чёрный цвет (RGB 000), выделяемцелевую вершину и красим её в красный.


внутри кода шейдера:

увеличиваем  входную структуру на вектор  цвета вершины 
типа  float3 VertexColor;

а затем в вертексном буфере  ставим проверку вершинам на покраску

Цитировать
if (VertexColor.x > 0)
{
  Pos=Pos+float3(sin(time),0,0);
}

где Pos -  float3 позиция    dt - float время

в таком случае  наша красная вершина  будет ходить туда-сюда


Название: Re: [sh] смещение вершины через шейдер hlsl
Отправлено: mkone112 от 18 Августа 2010, 18:57:15
Sqwer спасибо огромное но немог бы ты выложить пример такого шейдера полностью!!!Чтобы не осталось вопросов :D :D :D


Название: Re: [sh] смещение вершины через шейдер hlsl
Отправлено: Alteste от 02 Февраля 2011, 23:13:05
Думаю многим было бы интересно:
1. Красим вершины в 3D редакторе (в максе: в EditPoly пункт Vertex Properties или модификатор Vertex Paint). Одну в красный цвет, остальные - в черный.
2. Экспортируем в квест используя панду или квестовский экспортер
3. Подключаем HLSL Object канал и пишем код шейдера:
Код:
// матрица преобразования мирового пространства
float4x4 WorldVP : WorldViewProjection;

// Цепляем ValueVector через который будем двигать вершину по осям xyz
float3 movevector : CHANNELVALUE0 ;

// Определяем структуру исходящих данных
struct vertexOutput // Данные, которые мы передадим в вершинный шейдер
{
    float4 HPosition    : POSITION; // позиция вершины
    float4 color    : COLOR; // Цвет вершины
};

// Вершинный шейдер
vertexOutput VS(float4 position : POSITION, float4 vertcol : COLOR0) // Берем из 3D геометрии информацию о позиции вершин и их цвет
{
    vertexOutput OUT;
    OUT.HPosition = mul(position,WorldVP);// Модифицируем позиции вершин с учетом матрици мирового пространства
OUT.color = vertcol; // Передаем цвет вершин в шейдер
// Определяем условие, которое выполняется, если цвет вершины в компоненте .r больше нуля
if (vertcol.r > 0)
{
OUT.HPosition += float4(movevector,1); // Прибавим наш вектор
}

    return OUT;
}

// Пиксельный шейдер
float4 PS(vertexOutput IN) : COLOR
{return IN.color;} // Красим пиксели в цвет вершин по данным из вершинного шейдера

// Техника
technique Main
 {
    pass p0
 {
        VertexShader = compile vs_2_0 VS();
        PixelShader = compile ps_2_0 PS();
 }
}

И все вроде бы ничего, но:
По осям x и y вершина двигается без проблем, а вот по z - ведет себя как то странно. В чем проблема?


Название: Re: [sh] смещение вершины через шейдер hlsl
Отправлено: Ruslan от 03 Февраля 2011, 00:37:55
Попробуй так  ;)

Код:
// Матрицы
float4x4 WorldVP : WorldViewProjection;      // Произведение мировой, видовой и проекционной матриц
float4x4 World   : World;               // Матрица мирового преобразования
float4x4 WorldIT : WorldInverseTranspose;   // Инвертированная - транспонированная мир матрица

// Цепляем ValueVector через который будем двигать вершину по осям xyz
float3 movevector : CHANNELVALUE0 ;


// Входящие данные
struct a2v
{
    float4 HPosition    : POSITION; // позиция вершины
    float4 color    : COLOR; // Цвет вершины

};


 // Исходящие данные
struct v2f
{
    float4 HPosition    : POSITION; // позиция вершины
    float4 color    : COLOR; // Цвет вершины
};


// Вершинный шейдер
v2f VS(a2v IN)
{
    v2f OUT = (v2f)0;   // Обнуление выходной структуры
    OUT.HPosition = mul(IN.HPosition,WorldVP); // позиция в мировой системе координат
OUT.color = IN.color; // Передаем цвет вершин в шейдер
// Определяем условие, которое выполняется, если цвет вершины в компоненте .r больше нуля
if (IN.color.r > 0)
{

OUT.HPosition = IN.HPosition+float4(movevector,0); // Прибавим наш вектор
OUT.HPosition = mul(OUT.HPosition,WorldVP);
}

    return OUT;
}


// Пиксельный шейдер
float4 PS(v2f IN) : COLOR
{
return IN.color;
}

// Техника
technique Main
 {
    pass p0
 {
        VertexShader = compile vs_2_0 VS();
        PixelShader = compile ps_2_0 PS();
 }
}


+ вариант, без IF, в котором интенсивность компоненты .r влияет на силу деформации

Код:
// Матрицы
float4x4 WorldVP : WorldViewProjection;      // Произведение мировой, видовой и проекционной матриц
float4x4 World   : World;               // Матрица мирового преобразования
float4x4 WorldIT : WorldInverseTranspose;   // Инвертированная - транспонированная мир матрица

// Цепляем ValueVector через который будем двигать вершину по осям xyz
float3 movevector : CHANNELVALUE0 ;


// Входящие данные
struct a2v
{
    float4 HPosition    : POSITION; // позиция вершины
    float4 color    : COLOR; // Цвет вершины

};


 // Исходящие данные
struct v2f
{
    float4 HPosition    : POSITION; // позиция вершины
    float4 color    : COLOR; // Цвет вершины
};


// Вершинный шейдер
v2f VS(a2v IN)
{
v2f OUT = (v2f)0;   // Обнуление выходной структуры
 
OUT.color = IN.color; // Передаем цвет вершин в шейдер
float3 pos= mul(movevector,IN.color.r);
OUT.HPosition = IN.HPosition+float4(pos,0); // Прибавим наш вектор
OUT.HPosition = mul(OUT.HPosition,WorldVP);

return OUT;
}


// Пиксельный шейдер
float4 PS(v2f IN) : COLOR
{
return IN.color;
}

// Техника
technique Main
 {
    pass p0
 {
        VertexShader = compile vs_2_0 VS();
        PixelShader = compile ps_2_0 PS();
 }
}



еще один вариант, в котором вершины деформируются с учетом их нормалей


Код:
// Матрицы
float4x4 WorldVP : WorldViewProjection;      // Произведение мировой, видовой и проекционной матриц
float4x4 World   : World;               // Матрица мирового преобразования
float4x4 WorldIT : WorldInverseTranspose;   // Инвертированная - транспонированная мир матрица

float koef : CHANNELVALUE0 ; // сила деформации


// Входящие данные
struct a2v
{
    float4 HPosition    : POSITION; // позиция вершины
float3 normal       : NORMAL;    // Нормаль к поверхности
    float4 color    : COLOR; // Цвет вершины

};


 // Исходящие данные
struct v2f
{
    float4 HPosition    : POSITION; // позиция вершины
    float4 color    : COLOR; // Цвет вершины
};


// Вершинный шейдер
v2f VS(a2v IN)
{
v2f OUT = (v2f)0;   // Обнуление выходной структуры
OUT.color = IN.color; // Передаем цвет вершин в шейдер
float strength=mul(koef,IN.color.r);
float3 pos= mul(IN.normal,strength);
OUT.HPosition = IN.HPosition+float4(pos,0); // Прибавим наш вектор
OUT.HPosition = mul(OUT.HPosition,WorldVP);
return OUT;
}


// Пиксельный шейдер
float4 PS(v2f IN) : COLOR
{
return IN.color;
}

// Техника
technique Main
 {
    pass p0
 {
        VertexShader = compile vs_2_0 VS();
        PixelShader = compile ps_2_0 PS();
 }
}



Название: Re: [sh] смещение вершины через шейдер hlsl
Отправлено: Ruslan от 07 Июня 2011, 18:25:22
Факт:
оказывается Квест не поддерживает альфу в vertexColor  :-\
ума не приложу, почему разработчики так поступили, ведь в 3dsMax vertexColor полноценный. Экспортировал стандартным квестовым экспортером, возможно в нем проблема.