我无法在OpenGL中将Line Width设置为1像素

时间:2012-05-21 09:15:03

标签: opengl width line jogl antialiasing

我正在尝试将一些线路循环设置为1像素宽度,但是当宽度数字是奇数时我总是得到一些抗锯齿效果

这里有一些示例代码:

                    gl2.glLineWidth(1.0f); 
                    gl2.glBegin(GL2.GL_LINES); 
                        gl2.glVertex2i(-10, 0); 
                        gl2.glVertex2i(-10, 10); 
                    gl2.glEnd(); 

                    gl2.glLineWidth(2.0f); 
                    gl2.glBegin(GL2.GL_LINES); 
                        gl2.glVertex2i(-10, -10); 
                        gl2.glVertex2i(-10, 0); 
                    gl2.glEnd(); 

                    gl2.glLineWidth(3.0f); 
                    gl2.glBegin(GL2.GL_LINES); 
                        gl2.glVertex2i(-10, -20); 
                        gl2.glVertex2i(-10, -10); 
                    gl2.glEnd(); 

                    gl2.glLineWidth(4.0f); 
                    gl2.glBegin(GL2.GL_LINES); 
                        gl2.glVertex2i(-10, -30); 
                        gl2.glVertex2i(-10, -20); 
                    gl2.glEnd(); 

                    gl2.glLineWidth(5.0f); 
                    gl2.glBegin(GL2.GL_LINES); 
                        gl2.glVertex2i(-10, -40); 
                        gl2.glVertex2i(-10, -30); 
                    gl2.glEnd(); 

产生这个(按从上到下的顺序):

http://dl.dropbox.com/u/1401029/LineWidth.png

gl2.glIsEnabled(GL2.GL_LINE_SMOOTH)返回false并且gl2.glhint似乎根本不会影响它

任何想法?

2 个答案:

答案 0 :(得分:1)

根据the documentation,JOGL默认为MSAAx2。

初始时

setNumSamples(1)应该可以解决问题,但是你完全松散了抗锯齿。如果用NumSamples倍的期望值调用glLineWidth呢?

答案 1 :(得分:1)

在需要澄清之前OpenGL specification is not pixel-exact。实际上,你不能假装在每个OpenGL实现上都有相同的结果。

但是,在大多数可控输入值上,多边形光栅化可以在不同的实现上提供稳定的结果。

从您的评论中,您可以设置模型视图/投影矩阵:

gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity(); // map a 2D bild width*height on OpenGL
glu.gluOrtho2D(-width/2, (width+1)/2, -(height+1)/2, height/2);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();

我不知道widthheight类型和值,甚至不知道视口......但为了给你这个答案,我假设你有一个视口width x height,其中widthheight是您在代码中使用的变量,其值设置为100

确实,您建议您以这种方式设置投影矩阵:

gl.glMatrixMode(GL2.GL_PROJECTION);
gl.glLoadIdentity(); // map a 2D bild width*height on OpenGL
glu.gluOrtho2D(-width/2, +width/2, -height/2, height/2);
gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();

为了获得最大的可扩展性,我建议您附加以下模型视图矩阵转换:

gl.glMatrixMode(GL2.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glTranslate(0.376, 0.376, 0.0);

我不知道java OpenGL绑定的具体内容,但也要遵循 Calvin1602 所说的内容(禁用多重采样)。