Программирование шейдеров на 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)