c++ - 使用 glVertex2i() 绘制图形显示使用 glScaled() 缩放时的人工制品

标签 c++ opengl opengl-compat

我正在使用 OpenGL 绘制 RGB 图像直方图。由于这是一个 8 位图像直方图,我的数据集包含从 0 到 255 的数据点。

如果我在不使用 glScaled() 的情况下绘制直方图,则图形会按预期绘制,但当然不会填充分配的区域(宽度可变,高度不变)。但是,当我使用 glScaled() 时,图表显示出奇怪的人工制品。

请查看以下图片以查看问题示例:

Histogram without glScale

上图显示了使用 256 个数据点绘制的直方图,未使用 glScaled() 进行缩放。

Histogram plot with glScale

Same as above but with a larger scale

上面的两张图片显示了使用 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/

相关文章:

c++ - 如何设置opengl对象的大小?

c++ - 使用 C++ 可变长度参数时如何将 _TCHAR * 转换为 char *?

c++ - Rcpp NumericMatrix - 如何删除行/列?

c++ - 如何在 C++ 中使用 DLL

c++ - 如何用freeglut绘制菱形?

c++ - 如何为该球体添加纹理?

c++ - 正确格式化有错误的数字 (C++)

opengl - OpenGL 对四元数的支持是什么?

c++ - 虚拟试衣间设计

opengl - 将 SSAO 与全局光和局部光相结合