Сообщение от Mr_F_
делай маску в шейдере сам через clip или discard
|
Можно пожалуйста подробней?
Изучая урок по шейдерам для Хорса наткнулся вот на это:
"if (diffuse.a < 0.5f) discard; // реализация маски"
И попробовал вставить так (копипаста из урока):
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 = 8;
};
// входная структура для вершинного шейдера
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;
// трансформируем позицию вершины
output.position = mul (input.position, 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);
if (diffuse.a < 0.5f) discard; // реализация маски
// расчитываем освещенность точки
float lit = dot(input.normal, 8lightDirection);
// возвращаем результирующий цвет пиксела
return diffuse * entityColor * lit * lightColor;
}
technique Diffuse
{
pass p0
{
PixelShader = compile vs_3_0 VSMain();
VertexShader = compile ps_3_0 PSMain();
}
}
Я ещё тот нуб, не люблю читать всё от "корки док корки", стараюсь параллельно действовать самому. Короче отдельные элементы я вроде понимаю, но весь код шейдера вместе не осознаю.
"0.5f" это цвет? То есть если я понимаю - если в текстуре найден прозрачный пиксель(?) режем его?
"diffuse.a" - зачем точка?