20 Мая 2024, 09:46:11
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Навигация по форуму







guest3d
Quest3D - Русскоязычное сообщество > Quest3D > Визуализация, Шейдеры > [sh] смещение вершины через шейдер hlsl
[sh] смещение вершины через шейдер hlsl
(Прочитано 8513 раз)
  [1]
Печать
mkone112 | * | Новичок | Сообщений: 30 | « 18 Августа 2010, 02:18:44 »
[sh] смещение вершины через шейдер hlsl |
0
Как в шейдере анимировать одну отдельную конкретную вершину чтоб она постоянно двигалась "туда-сюда".
« Последнее редактирование: 18 Августа 2010, 14:30:47 от Sqwer »
Sqwer | ***** | Ветеран | Сообщений: 540 | «Ответ #1 18 Августа 2010, 14:27:53 »
Re: смещение вершины через шейдер hlsl |
1
Красим вершины модели  в чёрный цвет (RGB 000), выделяемцелевую вершину и красим её в красный.


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

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

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

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

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

в таком случае  наша красная вершина  будет ходить туда-сюда
« Последнее редактирование: 18 Августа 2010, 14:32:15 от Sqwer »
mkone112 | * | Новичок | Сообщений: 30 | «Ответ #2 18 Августа 2010, 18:57:15 »
Re: [sh] смещение вершины через шейдер hlsl |
2
Sqwer спасибо огромное но немог бы ты выложить пример такого шейдера полностью!!!Чтобы не осталось вопросов Веселый Веселый Веселый
Alteste | *** | Постоялец | Сообщений: 224 | «Ответ #3 02 Февраля 2011, 23:13:05 »
Re: [sh] смещение вершины через шейдер hlsl |
3
Думаю многим было бы интересно:
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 - ведет себя как то странно. В чем проблема?
Ruslan | ***** | Ветеран | Сообщений: 664 | «Ответ #4 03 Февраля 2011, 00:37:55 »
Re: [sh] смещение вершины через шейдер hlsl |
4
Попробуй так  Подмигивающий

Код:
// Матрицы
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();
 }
}

* deformation_of_the_vertices.CGR (80.56 Кб - загружено 823 раз.)

* deformation_of_the_vertices.jpg (33.96 Кб, 512x506 - просмотрено 1715 раз.)
« Последнее редактирование: 03 Февраля 2011, 15:25:00 от Ruslan »
Ruslan | ***** | Ветеран | Сообщений: 664 | «Ответ #5 07 Июня 2011, 18:25:22 »
Re: [sh] смещение вершины через шейдер hlsl |
5
Факт:
оказывается Квест не поддерживает альфу в vertexColor  В замешательстве
ума не приложу, почему разработчики так поступили, ведь в 3dsMax vertexColor полноценный. Экспортировал стандартным квестовым экспортером, возможно в нем проблема.
« Последнее редактирование: 07 Июня 2011, 18:43:25 от Ruslan »
 
  [1]
Печать
 
Quest3D - Русскоязычное сообщество > Quest3D > Визуализация, Шейдеры > [sh] смещение вершины через шейдер hlsl
Перейти в: