Показать сообщение отдельно
Старый 19.08.2011, 20:49   #270
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Вопрос по шейдеру рисующему расстояние от камеры до пикселей.


float4x4 matrixWorldViewProj : MATRIX_WORLDVIEWPROJ; // матрица итоговая
float4x4 matrixWorld : MATRIX_WORLD; // матрица мировая
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;
float depth : TEXCOORD1;
float2 texCoords : TEXCOORD0;
};
// вершинный шейдер
VSOutput VSMain(VSInput input)
{
// объект для выходных данных
VSOutput output;
// трансформируем позицию вершины
output.position = mul(input.position, matrixWorldViewProj);
// пишу глубину
output.depth = output.position.z;
// переписываем текстурные координаты
output.texCoords = input.texCoords;
// возвращаем результат
return output;
}
// пиксельный шейдер
float4 PSMain(VSOutput input) : COLOR0
{

//кодирую в красный то, что больше 256 и обрезаю его до диапозона (0,255)
//int red=clamp(trunc(input.depth/256), 0, 255);
int red=trunc(input.depth/25);
// пишу в зеленый то, что меньше 256
int green=trunc(input.depth-red*25);
//дробная часть
int blue=trunc(25*frac(input.depth));


return float4(0,green,blue,0);//input.depth;
}
// техника для отрисовки
technique Diffuse
{
pass p0
{
VertexShader = compile vs_2_0 VSMain();
PixelShader = compile ps_2_0 PSMain();
}
}
Вот этот слегка модифицированный шейдер из шагов рисует такую картинку.
То что линии на модели рисуются паралельно экрану радует. Но я ожидал нечто более близкое к градиенту или так и должно было получиться?

Теперь основной вопрос. Будет ли расстояние которое я записал цветом в шейдере равным расстоянию между видимой вершиной и камерой в хорсе?
(Offline)
 
Ответить с цитированием