【问题标题】:opengl rendering pixels gives white linesopengl渲染像素给出白线
【发布时间】:2014-12-30 11:26:55
【问题描述】:

我试图通过逐个像素地绘制图像来渲染图像(是的,我知道这不是最有效的,但它更多地用于学习目的)并且我遇到了一个奇怪的问题,它会像这样绘制白线:@987654321 @

我使用 glut 和 Visual Studio 2013。这是我的glutinit

glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); // Double buffering, RGB format
glutInitWindowSize(width, heigth);
glutInitWindowPosition(0, 0);
glutCreateWindow("Test Plaatje");
glClearColor(1.0, 1.0, 1.0, 1.0);

glColor3f(1.0, 1.0, 1.0);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 1024, 0.0, 500);
glMatrixMode(GL_MODELVIEW);

这是我的渲染代码,其中解释了一些变量:

...
std::vector<std::vector<RGB>> _map = std::vector<std::vector<RGB>>();
...
struct RGB
{
    int R;
    int G;
    int B;
};
...

void Map::draw()
{
    glBegin(GL_POINTS);

    for (float x = 0; x < _w; x++)
    {
        for (float y = 0; y < _h; y++)
        {
            RGB pixel = _map[y][x];
            glColor3ub(pixel.R, pixel.G, pixel.B);
            glVertex2f(_p[0] + x, _p[1] + y);
        }
    }

    glEnd();
}

我已经尝试用一些十进制值移动像素,但没有奏效。我通过将像素值转储到文件来验证_map 是正确的。作为参考,这是它应该呈现的内容:

我不知道如何解决这个问题。有人有什么想法吗?

【问题讨论】:

  • 试试这个:glHint(GL_POINT_SMOOTH_HINT, GL_NICEST); 你可能想事先启用混合:glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_POINT_SMOOTH); 但我不确定哪些是必要的,哪些不是。也尝试增加点大小glPointSize(2.0)
  • @n.m.我使用了 glEnable(GL_BLEND); glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);它奏效了!谢谢!
  • 假设您的窗口和图像都是 1024x500 像素(并且模型视图矩阵留在标识处),如果 _p[0]_p[1] 设置为 0.5,您的代码应该可以工作,而不必使用GL_POINT_SMOOTH.
  • @derhass 是的,但这因配置而异。 p 确保窗口中有一个顶部和侧边栏。
  • @user2988415:你能详细说明一下吗?问题是,您设置了投影矩阵,使像素中心位于“.5”,并且像素边界恰好位于整数处。理想情况下,您应该始终在像素中心绘制点。但是,无论您在 _p 和模型视图矩阵中输入什么内容,都会对此产生影响。

标签: c++ opengl visual-c++ freeglut


【解决方案1】:

在 n.m.提示我添加了 glEnable(GL_BLEND); glEnable(GL_POINT_SMOOTH); glHint(GL_POINT_SMOOTH_HINT, GL_NICEST);在我的初始化结束时,它起作用了!

【讨论】:

  • 自@n.m.提示有效,我认为最好让他/她将其发布为答案并接受它:)
  • @AdriC.S.当他这样做时,我会的。我只是觉得如果答案已经很清楚就好了。
  • @AdriC.S.信用归功于发布经过验证的答案的人。我不确定什么确切的配置会起作用,我仍然不确定这个配置是最优的。
  • @n.m 这可能不是最佳的,但您的解决方案有效。
【解决方案2】:

你可以通过多种方式解决这个浮点错误:

  • 使用 glPointSize(2.0)
  • 使用混合和点平滑
  • 移动顶点坐标以在像素中心 +.5,+.5 中投影
  • 使用 glRect 代替 begin/vertex/end

个人我更喜欢顶点移位。但是,如果您打算缩放图像,更好的方法是 glRect。

如果您正在寻找更严肃的解决方案,您应该考虑将像素上传到纹理并使用单个四边形进行绘制。也可以考虑使用 glDrawPixels。

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多