Опубликован: 02.12.2011 | Уровень: специалист | Доступ: платный
Лекция 12:

Устранение эффекта ступенчатости

< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Аннотация: В лекции рассматривается один из методов устранения ступенчатости изображения, формируемого библиотекой OpenGL.

Цель лекции: Изучить команды работы с буфером аккумулятора и метод "джиттеринга" (дрожания), используемого для устранения эффекта ступенчатости изображения OpenGL.

Примеры на C# (WinForms) и Object Pascal (Delphi)

Пример № 11.1 Пример демонстрирует устранение эффекта ступенчатости с помощью "джиттеринга".

В большинстве случаев для отображения изображения используются матричные устройства. В связи с этим часто возникает необходимость устранения или, по крайней мере, уменьшения таких эффектов как ступенчатость линий и резких переходов цвета между объектами.

Одним из вариантов получения эффекта сглаживания изображения сцены является использование буфера накопления. Иногда такой способ называют эффектом дрожания или "джитеринг" (от английского слова jitter). Суть этого способа заключается в том, что перед отображением сцены её прорисовывают в буфере накопления несколько раз с небольшим смещением в каждом случае. За счет этого результирующее изображение получается несколько размытым и переход цветов на границе объектов получается более плавным. Это позволяет уменьшить эффекты ступенчатости и резких переходов цветов.

Качество сглаживания обычно пропорционально количеству прорисовок сцены. При выборе координат смещения сцены относительно исходного положения обычно используют набор массивов, значения которых позволяют получить наилучший эффект сглаживания сцены при заданном количестве прорисовок сцены.

Ниже приведено содержание класса Jitter на C#, который содержит реализацию методов, используемых для реализации эффекта сглаживания. В классе так же объявлены массивы различного размера, которые содержат смещения, которые используются для получения эффекта сглаживания.

class Jitter
{
  public struct PointPloat
  {
    public float X;
    public float Y;
  }
  public static PointPloat[] j2 = new PointPloat[2]
  { 
    new PointPloat{X=  0.246490f,Y=  0.249999f}, 
    new PointPloat{X=  0.246490f,Y=  0.249999f}
  };
  public static PointPloat[] j3 = new PointPloat[3]
  {
    new PointPloat{X= -0.373411f, Y= -0.250550f},
    new PointPloat{X=  0.256263f, Y=  0.368119f},
    new PointPloat{X=  0.117148f, Y= -0.117570f}
  };
  public static PointPloat[] j4 = new PointPloat[4]
  {        
    new PointPloat{X= -0.208147f, Y=  0.353730f}, 
    new PointPloat{X=  0.203849f, Y= -0.353780f},
    new PointPloat{X= -0.292626f, Y= -0.149945f}, 
    new PointPloat{X=  0.296924f, Y=  0.149994f}
  };
  public static PointPloat[] j8 = new PointPloat[8]
  {
    new PointPloat{X= -0.334818f, Y=  0.435331f}, 
    new PointPloat{X=  0.286438f, Y= -0.393495f},
    new PointPloat{X=  0.459462f, Y=  0.141540f}, 
    new PointPloat{X= -0.414498f, Y= -0.192829f},
    new PointPloat{X= -0.183790f, Y=  0.082102f}, 
    new PointPloat{X= -0.079263f, Y= -0.317383f},
    new PointPloat{X=  0.102254f, Y=  0.299133f}, 
    new PointPloat{X=  0.164216f, Y= -0.054399f}
  };
  public static void AccFrustum(double left, double right, 
    double bottom, double top, 
    double anear, double afar, double pdx, double pdy)
  {
    double xwsize, ywsize, dx, dy;
    int[] viewport = new int[4];
    GL.GetInteger(GetPName.Viewport, viewport);
    xwsize = right - left;
    ywsize = top - bottom;
    dx = -(pdx * xwsize / viewport[2]);
    dy = -(pdy * ywsize / viewport[3]);
    GL.MatrixMode(MatrixMode.Projection);
    GL.LoadIdentity();
    GL.Frustum (left + dx, right + dx, bottom + dy, top + dy, anear, afar);
    GL.MatrixMode(MatrixMode.Modelview);
  }
  public static void AccOrtho(double left, double right, 
    double bottom, double top, 
    double anear, double afar, double pdx, double pdy)
  {
    double xwsize, ywsize, dx, dy;
    int[] viewport = new int[4];
    GL.GetInteger(GetPName.Viewport,  viewport);
    xwsize = right - left;
    ywsize = top - bottom;
    dx = -(pdx*xwsize/viewport[2]);
    dy = -(pdy*ywsize/viewport[3]);
    GL.MatrixMode(MatrixMode.Projection);
    GL.LoadIdentity();
    GL.Ortho(left + dx, right + dx, bottom + dy, top + dy, anear, afar);
    GL.MatrixMode(MatrixMode.Modelview);
  }
}
Листинг 11.1. Класс Jitter для реализации эффекта сглаживания на C# с использованием библиотеки OpenTK
< Лекция 11 || Лекция 12: 12 || Лекция 13 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?

 

Олег Шумилин
Олег Шумилин
Казахстан
Махмуд Магомедов
Махмуд Магомедов
Россия, Москва, МГТУ "СТАНКИН"