Cri*_*986 5 c++ opengl antialiasing
在我的工作中,我将捕获的帧的一部分与图像重叠.我用openCV打开网络摄像头,然后在纹理中转换捕获的帧并在GLUT窗口中显示它.此外,我将此纹理的一部分与此图像重叠:

我是实时做的,结果是:

如您所见,投影图像的边缘不准确.我认为这是一个别名问题,但我不知道如何使用opengl进行抗锯齿处理.我试图在网上寻找,但我找不到解决问题的好方法.
在我的"计算"功能中,我将mat图像转换为纹理,使用以下代码:
GLvoid calculate(){
...
...
cvtColor(image, image, CV_BGR2RGB);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
//glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.cols, image.rows, GL_RGB, GL_UNSIGNED_BYTE, image.data);
}
Run Code Online (Sandbox Code Playgroud)
并使用此代码显示结果:
GLvoid Show(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
// Matrice di proiezione
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, WIDTH, HEIGHT, 0);
// Matrice model view
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
...
...
glBindTexture(GL_TEXTURE_2D, textures[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((coord[3].x)),(GLfloat)(coord[3].y));
glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((coord[0].x)),(GLfloat)(coord[0].y));
glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((coord[1].x)),(GLfloat)(coord[1].y));
glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((coord[2].x)),(GLfloat)(coord[2].y));
glEnd();
}
glFlush();
glutSwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)
在初始化函数中我写这个:
GLvoid Init() {
glGenTextures(2, textures);
glClearColor (0.0, 0.0, 0.0, 0.0);
glEnable (GL_POLYGON_SMOOTH);
glHint (GL_POLYGON_SMOOTH_HINT, GL_DONT_CARE);
glDisable(GL_DEPTH_TEST);
}
Run Code Online (Sandbox Code Playgroud)
但它不起作用......
我在Win7 x64上工作,使用OPenGL 4.0和Glut 3.7.我的视频卡是NVidia GeForce gt 630.我也从Nvidia控制面板启用了抗锯齿功能,但没有任何改变.有谁知道如何帮助我?
首先我想知道为什么你要使用 OpenGL 4.0 来处理固定(已弃用)管道...但是让我们解决问题。你需要的是MSAA。我不确定,通过控制面板启用它总是可以解决问题。通常它是在代码内部完成的。不幸的是,您选择使用 GLUT,它没有设置硬件 MSAA 级别的选项。如果您希望能够这样做,请切换到GLFW。另一个选项是手动执行,但这意味着您使用自定义 FBO。在这样的情况下您可以使用 MSAA 纹理附件创建 FBO,设置纹理的 MSAA 级别(如果您愿意,您也可以在片段着色器中应用自定义多重采样算法)。 这是关于这个主题的主题。
GLFW 允许您在窗口设置上指定 MSAA 级别。请参阅相关 API。
MSAA 确实会降低性能,但降低程度取决于您的硬件,可能还取决于 OpenGL 驱动程序。