C++ opengl渲染像素时会产生白线

C++ opengl渲染像素时会产生白线,c++,opengl,visual-c++,freeglut,C++,Opengl,Visual C++,Freeglut,我试图通过逐像素绘制图像来渲染图像(是的,我知道这不是最有效的,但更适合于学习),我遇到了一个奇怪的问题,它绘制了如下白线: 我使用glut和visual studio 2013。这是我的glutinit: glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH | GLUT_ALPHA); // Double buffering, RGB format glutInitWindowSize(width, heigth); glutIni

我试图通过逐像素绘制图像来渲染图像(是的,我知道这不是最有效的,但更适合于学习),我遇到了一个奇怪的问题,它绘制了如下白线:

我使用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();
}
。。。
std::vector _map=std::vector();
...
结构RGB
{
INTR;
int G;
int B;
};
...
void Map::draw()
{
glBegin(总分);
用于(浮动x=0;x<_w;x++)
{
对于(浮动y=0;y<\u h;y++)
{
RGB像素=_贴图[y][x];
glColor3ub(像素.R,像素.G,像素.B);
glVertex2f(p[0]+x,p[1]+y);
}
}
格伦德();
}
我已经尝试过用一些十进制值移动像素,但没有效果。通过将像素值转储到文件中,我验证了
\u映射
是否正确。作为参考,这是它应该呈现的内容:


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

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

您可以通过多种方式解决此浮点错误:

  • 使用glPointSize(2.0)
  • 使用“混合”和“点平滑”
  • 将顶点坐标移动到像素中心+.5、+.5
  • 使用glRect而不是开始/顶点/结束
Personalny我想先换一下vertex shift。但若你们打算放大你们的图像,更好的方法是glRect


如果你正在寻找更严肃的解决方案,你应该考虑将你的像素上传到纹理并用一个四元组绘制它。也可以考虑使用GLRUGPENG。

尝试:<代码> GLYNT(GLPoPositStaskLosit,GLN-NICEST);<代码>您可能希望事先启用混合:
glEnable(GL\u混合);glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA);glEnable(GL_POINT_SMOOTH)但我不确定哪些是必需的,哪些不是。同时尝试增加点大小
glPointSize(2.0)
@n.m.我使用了glEnable(glu混合);glEnable(GL_POINT_SMOOTH);glHint(GL_POINT_SMOOTH_HINT,GL_NICEST);成功了!谢谢你!假设您的窗口和图像都是1024x500像素(modelview矩阵保留在identity位置),如果
\u p[0]
\u p[1]
设置为0.5,您的代码应该可以工作,而不必使用
GL\u POINT\u SMOOTH
@derhass是,但这随配置而变化。p确保窗口中有一个顶部和侧栏。@user2988415:你能详细说明一下吗?问题是,设置投影矩阵,使像素中心位于“.5”,像素边界正好位于整数处。理想情况下,应始终在像素中心绘制点。但是无论您在
\u p
和modelview矩阵中输入什么,都会影响这一点。既然@n.m.提示有效,我认为最好让他/她将其作为答案发布并接受:)@AdriC.s。他来的时候我会的。我只是觉得如果答案已经很清楚就好了。信用是由于谁张贴了一个验证的答案。我不确定什么样的配置会起作用,我也不确定这个配置是最优的。@n.m它可能不是最优的,但你的解决方案起作用了。