ПрограммированиеСтатьиГрафика

Программирование шейдеров на HLSL. (6 стр)

Wood Shader.

Эффект заключается в генерировании древесной поверхности объекта. Вот так выглядит wood shader:

Изображение

wood shader без освещения и с освещением.

Для такого эффекта нам понадобится текстура, обработанная noise фильтром. Пример такой текстуры:

Изображение

Древесная поверхность состоит из колец, оси которых постоянно меняются и как бы скачут взад-вперед между полосами. Такой эффект легко можно задать функцией остатка: Rings(R)=frac(R),
где R – радиус колец, который вычисляется между текстурными координатами x и y.

Алгоритм для фрагментного шейдера:

1)Рассчитываем вектор искривления линии (Wooble или Skew), который равен суме текстурных координат и цвета из noise текстуры.
float3 shade = pos + (tex2D(Noise,pos));
Т.е. примерно получится что-то такое: Изображение

2)Вычисляем длину вектора искривления линии:
float dist = length (shade);
В эту часть алгоритма также можно добавить некий параметр num, который задает количество линий: float dist = length(shade)*num;

3)Полученное значение dist осталось занести в основную функцию древесного шейдера: float main_color = frac(dist); И для придания натуральности древесной поверхности помножим main_color на коричневый цвет:
return main_color*float4(0.5,0.3,0.01,0);

Все бы хорошо, но без освещения такой эффект не смотрится. Добавим диффузионную модель освещения. Для этого помножим результирующий свет на формулу расчета диффузной освещенности:
return main_color*float4(0.5,0.3,0.01,0)*((diffuse_color * diffuse_intensity) *dot(normal, lt));

Фрагментный шейдер:

float4  ambient_color;
float   ambient_intensity;
float4  diffuse_color;
sampler noise_texture;
sampler line_color_texture;

float4 main (float2 coords : TEXCOORD0, float3 lt:  TEXCOORD1, float3 normal: TEXCOORD2) : COLOR
{
    float3 shade = pos + (tex2D(Noise,pos));
    float dist = length (shade);
    float main_color = frac(dist);
    return main_color*float4(0.5f,0.5f,0.01f,0.0f)*(( diffuse_color *
              diffuse_intensity)*dot(normal, lt));
}

Алгоритм вершинного шейдера составляет точную копию алгоритма вершинного шейдера dizzy эффекта.
Вершинный шейдер:

float4x4 view_proj_matrix;
float4x4 view_matrix;
float4 light;

struct VS_OUTPUT
{
   float4 Pos       : POSITION;
   float2 TexCoords   : TEXCOORD0;
   float3 light   : TEXCOORD1;
   float3 normal   : TEXCOORD2;
};  


VS_OUTPUT main (float4 pos: POSITION, float3 normal: NORMAL)
{
   VS_OUTPUT Out = (VS_OUTPUT) 0; 
   Out.Pos = mul (view_proj_matrix,pos);
   //масштабирование текстурных координат.
   Out.TexCoords = pos/25;
   Out.light=light;
   Out.normal=normalize(mul(view_matrix,normal));
   return Out;
}
Страницы: 1 2 3 4 5 6 7 Следующая »

#3D, #Direct3D, #DirectX, #HLSL, #шейдеры

1 июня 2004 (Обновление: 19 июня 2024)

Комментарии [151]