我正在使用 OpenGL 绘制 RGB 图像直方图。由于这是一个 8 位图像直方图,我的数据集包含从 0 到 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 中解决这个问题,或者我是否必须通过某种插值来增加数据点的数量,然后在不缩放的情况下进行绘图?
我感谢提供的任何帮助。
最佳答案
如果将渲染分成 3 个 channel ,您应该能够使用三角形带而不是线带(应该填充间隙)。
glBegin(GL_TRIANGLE_STRIP);
glColor4ub(255, 0, 0, 255);
for (int n = 0; n < m_histogram_X; n++)
{
glVertex2i(n, m_Hist_Channel_R[n]);
glVertex2i(n, GRAPH_HEIGHT);
}
glEnd()
glBegin(GL_TRIANGLE_STRIP);
glColor4ub(0, 255, 0, 255);
for (int n = 0; n < m_histogram_X; n++)
{
glVertex2i(n, m_Hist_Channel_G[n]);
glVertex2i(n, GRAPH_HEIGHT);
}
glEnd()
glBegin(GL_TRIANGLE_STRIP);
glColor4ub(0, 0, 255, 255);
for (int n = 0; n < m_histogram_X; n++)
{
glVertex2i(n, m_Hist_Channel_B[n]);
glVertex2i(n, GRAPH_HEIGHT);
}
glEnd()
关于c++ - 使用 glVertex2i() 绘制图形显示使用 glScaled() 缩放时的人工制品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56138122/