Программирование шейдеров на HLSL. (6 стр)
Wood Shader.
Эффект заключается в генерировании древесной поверхности объекта. Вот так выглядит 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; }
#3D, #Direct3D, #DirectX, #HLSL, #шейдеры
1 июня 2004 (Обновление: 19 июня 2024)