
float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая
float time;
float3 lightDirection : LIGHT0_DIRECTION; // направление
float4 lightColor : LIGHT0_COLOR; // цвет
float4 entityColor : COLOR_DIFFUSE; // цвет объекта
texture diffuseTexture : TEXTURE_0; // текстура
// описываем sampler
sampler diffuseSampler = sampler_state
{
Texture = <diffuseTexture>; // привязываем текстуру
// устанавливаем адресацию координат
AddressU = WRAP;
AddressV = WRAP;
AddressW = WRAP;
// устанавливаем фильтрацию
MinFilter = ANISOTROPIC;
MagFilter = ANISOTROPIC;
MipFilter = ANISOTROPIC;
// устанавливаем уровень фильтрации
MaxAnisotropy = 4;
};
// входная структура для вершинного шейдера
struct VSInput
{
float4 position : POSITION;
float3 normal : NORMAL;
float2 texCoords : TEXCOORD0;
};
// структура для результата вершинного шейдера
struct VSOutput
{float4 position : POSITION;
float3 normal : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{
// объект для выходных данных
VSOutput output;
// трансформируем позицию вершины
float xoops = input.position.x-8*cos(radians(time/10+3*input.position.x));
float yoops = input.position.z-6*sin(radians(time/35+1.5*input.position.z));
float zoops = 8*cos(radians(time/10+3*input.position.x))+6*sin(radians(time/35+1.5*input.position.z));
output.position = mul(float4(input.position.xyz+float3(xoops,zoops,yoops),input.position.w), matrixWorldViewProj);
// трансформируем и нормализуем нормаль
output.normal = normalize(mul(input.normal, matrixWorld));
// переписываем текстурные координаты
output.texCoords = input.texCoords;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{
// делаем выборку из текстуры
float4 diffuse = tex2D(diffuseSampler, input.texCoords);
// расчитываем освещенность точки
float lit = dot(input.normal, -lightDirection*1.5f);
// возвращаем результирующий цвет пиксела
return (diffuse * entityColor * lit * lightColor);
}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_2_0 PSMain();
}
}
в общем ввел я деформацию в шейдер. Ништяк, теперь плоскость гнется без затрат процессорного времени. Прям как будто я рендрю просто плоскость и ничего с ней не делаю. Но нормали не меняются. А рассчитать нормали я пока умею посчитав плоскость по трем точкам. Но как получить координаты трех точек принадлежащих полигону в шейдере? Или проще научиться искать касательные к уравнениям деформации? Это вроде производная от них?
Вопрос такой: Как вы находите новые нормали изменив геометрию вершинным шейдером? Может есть простой способ?
HolyDel, а шерсть это тоже только от 10 версии?