Помогите понять эффект Pixelate - PullRequest
0 голосов
/ 29 апреля 2011

Я новый HLSL, и я пытаюсь понять образец pixelate.Тем не менее, я не смог найти справку о том, как проходит несколько операций.Вот пример шейдера:

//--------------------------------------------------------------------------------------
// 
// 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);

Я не уверен, что как вычислить деление междудва вектора, а также я не знаю, как вычислить пол вектора.(Я предполагаю, что разделение двух чисел с плавающей точкой возвращает число с плавающей точкой2).

Есть идеи?

1 Ответ

1 голос
/ 29 апреля 2011

Операторы и функции HLSL часто работают с такими структурами, как float2, у которых есть x и y.

Деление внутри этажа возвращает float2, где x и y являются результатом деления x на x и y на y. И floor вернет float2, где x и y результата - это промежуточные значения x и y ввода (результат деления).

То же самое верно для float3 и других подобных структур.

...