#graphics #hlsl #shader #pixel-shader
#графика #hlsl #шейдер #пиксельный шейдер
Вопрос:
Я новичок в HLSL и пытаюсь понять образец пикселизации. Тем не менее, я не смог найти ссылку о том, как выполняется пара операций. Вот пример шейдера:
//--------------------------------------------------------------------------------------
//
// WPF ShaderEffect HLSL -- PixelateEffect
//
//--------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------
// Shader constant register mappings (scalars - float, double, Point, Color, Point3D, etc.)
//-----------------------------------------------------------------------------------------
float HorizontalPixelCounts : register(C0);
float VerticalPixelCounts : register(C1);
//--------------------------------------------------------------------------------------
// Sampler Inputs (Brushes, including ImplicitInput)
//--------------------------------------------------------------------------------------
sampler2D implicitInputSampler : register(S0);
//--------------------------------------------------------------------------------------
// Pixel Shader
//--------------------------------------------------------------------------------------
float4 main(float2 uv : TEXCOORD) : COLOR
{
float2 brickCounts = { HorizontalPixelCounts, VerticalPixelCounts };
float2 brickSize = 1.0 / brickCounts;
// Offset every other row of bricks
float2 offsetuv = uv;
bool oddRow = floor(offsetuv.y / brickSize.y) % 2.0 >= 1.0;
if (oddRow)
{
offsetuv.x = brickSize.x / 2.0;
}
float2 brickNum = floor(offsetuv / brickSize);
float2 centerOfBrick = brickNum * brickSize brickSize / 2;
float4 color = tex2D(implicitInputSampler, centerOfBrick);
return color;
}
Я не смог понять, какие вычисления происходят в:
float2 brickNum = floor(offsetuv / brickSize);
Я не уверен, что как вычислить разделение между двумя векторами, а также я не знаю, как вычислить пол вектора. (Я предполагаю, что деление двух значений float2 возвращает значение float2).
Есть идеи?
Ответ №1:
Операторы и функции HLSL часто работают со структурами, подобными float2, которые имеют x и y.
Деление внутри floor возвращает a, float2
где x
и y
являются результатом деления x
на x
и y
с y
. И floor вернет a, float2
где x
и y
результата — это значение floor для x
и y
входных данных (результат деления).
То же самое верно для float3 и других подобных структур.