Я использую OpenGL для построения гистограммы изображения RGB.Поскольку это гистограмма 8-битного изображения, мой набор данных содержит точки данных от нуля до 255.
Если я строю гистограмму без использования glScaled (), тогда график строится, как и ожидалось, но, конечно,не заполнять выделенную область (ширина которой является переменной, постоянная высоты).Однако, когда я использую glScaled (), график показывает странные артефакты.
См. Следующие изображения, чтобы увидеть пример проблемы:
На изображении выше гистограмма представлена в видепостроено с 256 точками данных без масштабирования с помощью glScaled ().
Два изображения выше показывают гистограмму в виде графика с 256 точками данных И масштабируются с помощью glScaled ().Странные артефакты очевидны (недостающие данные?).Обратите внимание, что третья гистограмма имеет немного другую форму из-за изменения уровня освещенности.
Вот соответствующая часть моего кода инициализации OpenGL:
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, width, height, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// If this line is removed then the graph plots correctly
// m_scale_factor = width / 256
glScaled(m_scale_factor, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
А вотсоответствующая часть кода моего сюжета:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
glBegin(GL_LINE_STRIP);
for (int n = 0; n < m_histogram_X; n++)
{
glColor4ub(255, 0, 0, 255);
glVertex2i(n, m_Hist_Channel_R[n]);
glVertex2i(n, GRAPH_HEIGHT);
glColor4ub(0, 255, 0, 255);
glVertex2i(n, m_Hist_Channel_G[n]);
glVertex2i(n, GRAPH_HEIGHT);
glColor4ub(0, 0, 255, 255);
glVertex2i(n, m_Hist_Channel_B[n]);
glVertex2i(n, GRAPH_HEIGHT);
}
glEnd()
...
На этом этапе я чувствую, что должен заявить, что я новичок в OpenGL, поэтому возможно, что я неправильно понял многие вещи OpenGL ...
Мой вопрос: возможно ли исправить эту проблему в OpenGL, или мне придется увеличить число точек данных путем некоторой интерполяции, а затем построить график без масштабирования?
Я ценю любую предложенную помощь.