Войти
ПодсказкиСтатьи

Рисование точек с использованием геометрического шейдера (пример на D3D11)

Автор:

Screenshot 2021-05-15 170527 | Рисование точек с использованием геометрического шейдера (пример на D3D11)

Преобразовываем точку в пространстве в точку на экране, потом сдвигаем в 2д пространстве сгенерированные точки делая например квадрат.

Сначала идёт работа вершинного шейдера.

output.pos = mul(WVP, float4(input.position,1.f));
output.pos = output.pos / output.pos.w; // обязательно делаем это

В геометрический шейдер нужно послать размер вьюпорта.

[maxvertexcount(4)]
void GSMain(point VSOut input[1], inout TriangleStream<VSOut> TriStream ){
  VSOut Out;
  Out.vColor = input[0].vColor;

  const float sz = 5.f;  // размер самой точки так-же можно будет указать вне шейдера
  float h = 2.f / Viewport.y;
  float w = 2.f / Viewport.x;
  float x = sz * w; // размер точки с учётом размера вьюпорта
  float y = sz * h;
  float half_x = x * 0.5f; // делаю половинки чтобы потом разположить точку по центру
  float half_y = y * 0.5f;
  const float4 sizes[4] = {
    float4(-half_x, -half_y, 0, 0),
    float4(-half_x, half_y, 0, 0),
    float4(half_x, -half_y, 0, 0),
    float4(half_x, half_y, 0, 0)
  };
  for (uint i = 0; i<4; ++i)
  {
    Out.pos =input[0].pos;
    Out.pos += sizes[i];
    TriStream.Append(Out);
  }

  TriStream.RestartStrip();
}

struct VSOut{
  float4 pos : SV_POSITION;
  float4 vColor : COLOR0;
};

#графика

15 мая 2021