Войти
OpenGL communityФорумВопросы по программированию

glReadPixels сошел с ума

#0
21:13, 30 окт. 2013

Писал я библиотечку для быстрого рисования 2D графики, и столкнулся с проблемой в glReadPixels во время реализации FloodFill:
Есть у меня на экране картинка:
Изображение.

Я читаю ее в массив с помощью glReadPixels и рисую этот массив:

auto height = myWindow.GetHeight();
auto width = myWindow.GetWidth();
Color *data = new Color[height * width];

glReadBuffer(GL_FRONT);//(Colors::white);
glReadPixels(0, 0, width, height, GL_RGB, GL_FLOAT, data);

for (auto i = 0; i < height; ++i)
{
  for (auto j = 0; j < width; ++j)
  {
    glRasterPos2i(j, i);//, data[(height - i - 1)*width + j]);
    glDrawPixels(1, 1, GL_RGB, GL_FLOAT, data + ((height - i - 1)*width + j));
  }
}

И получаю вот такой треш:
Изображение

P.S. Color объявлен вот так:

struct Color
{
  float r, g, b;

  Color(float r = 0, float g = 0, float b = 0) : r(r), g(g), b(b)
  {}

  Color operator+ (const Color &right)
  {
    Color result(r + right.r, g + right.g, b + right.b);
    float maxc = max(result.r, max(result.b, result.g));

    result.r /= maxc;
    result.g /= maxc;
    result.b /= maxc;

    return result;
  }

  bool operator== (const Color &right)
  {
    return right.r == r && right.b == b && right.g == g;
  }
};

Как мне получить нормальный кадр?


#1
22:31, 30 окт. 2013

Norpadon
> glReadPixels
> glRasterPos2i
> glDrawPixels
> библиотечку для быстрого рисования 2D графики
Жесть.

По делу: уверен, что width и height соответствуют размеру клиентской области окна?

#2
22:49, 30 окт. 2013

Быстрого - значит не эффективного, а с минимальными затратами времени на написание кода (для визуализации графов и тд.).
Ни RasterPos, ни DrawPixels я на практике использую, они тут просто для того, чтобы показать что за бред происходит.

width и height - те же, что передаются в CreateWindow, после этого они гарантированно не меняются, как и фактический размер окна.

#3
22:54, 30 окт. 2013

а че просто весь массив нельзя отрисовать?

glRasterPos2i(0, 0);
glDrawPixels(width, height, GL_RGB, GL_FLOAT, data);

Но насколько я понял тебе надо перевернуть чтоли изображение? Тогда рисуй строками

for (auto i = 0; i < height; i++)
{
    glRasterPos2i(0, i);
    glDrawPixels(width, 1, GL_RGB, GL_FLOAT, data + ((height - i - 1)*width));
}

ну а если хочешь чтобы было как у тебя - разберись с циклами и индексами i и j
у тебя тупо выходит за пределы width. Странно еще что программа не валится.
юзай i++ и j++ а не ++i и ++j

#4
23:02, 30 окт. 2013

Norpadon
> width и height - те же, что передаются в CreateWindow, после этого они
> гарантированно не меняются, как и фактический размер окна.
тебе нужен размер клиентской области.
Используй GetClientRect(). Возвращенные width и height еще нужно сунуть в glViewport и в матрицу проекции.

#5
23:03, 30 окт. 2013

RmzVoid
> юзай i++ и j++ а не ++i и ++j
Зачем?

#6
1:30, 31 окт. 2013

Blew_zc
> тебе нужен размер клиентской области.

Спасибо, помогло! Можно закрывать

OpenGL communityФорумВопросы по программированию

Тема в архиве.