实际上,我要做的是显示与我创建的窗口大小相同的图像。但是我发现带有图像纹理的矩形会稍微放大,以便图像的边缘不可见。
因此,我做了以下实验:对于窗口大小为500x500的窗口,我先用红色绘制一个大小为500x500的矩形,然后用黑色的(500-2)*(500-2)绘制第二个矩形。我得到的只是一个黑色的窗户。通过将代码中的d值增加到8,红线显示在左/右和底部,顶部显示直到d =33。
我认为是因为深度或投影,但我不知道如何解决。有什么建议吗?
以下是我的示例代码:
#include <GL/glut.h> /* glut.h includes gl.h and glu.h*/
void rectangle(float x, float y, float x1, double y1, float r, float g, float b)
{
glColor3f(r, g, b);
glBegin(GL_QUADS);
glVertex2f(x, y);
glVertex2f(x, y1);
glVertex2f(x1, y1);
glVertex2f(x1, y);
glEnd();
}
void display()
{
/* clear window */
glClear(GL_COLOR_BUFFER_BIT);
int d = 33;
// draw rectangle in red
rectangle(d, d, 500 - d, 500 - d, 1, 0, 0);
// draw rectangle in black
rectangle(d + 1, d + 1, 500 - d - 1, 500 - d - 1, 0, 0, 0);
/* flush GL buffers */
glFlush();
}
void init()
{
/* set clear color to black */
glClearColor(0.0, 0.0, 0.0, 0.0);
/* set fill color to white */
/* set up standard orthogonal view with clipping */
/* box as cube of side 2 centered at origin */
/* This is default view and these statements could be removed */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, 500, 0, 500);
}
int main(int argc, char** argv)
{
/* Initialize mode and open a window in upper left corner of
/* screen */
/* Window title is name of program (arg[0]) */
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutInitWindowPosition(0, 0);
glutCreateWindow("simple");
glutDisplayFunc(display);
init();
glutMainLoop();
}
答案 0 :(得分:0)
我不确定这是否是一个过大的bug,但是我发现偏移值刚好等于窗口边框的厚度。也就是说,对于左/右/底边缘,偏移量= 9像素,顶部偏移量= 32。
看起来,尽管glutInitWindowSize(500,500)用500x500初始化了窗口的黑色区域,但它还假定包括边框在内的整个窗口大小为500x500。然后,当我绘制500x500的矩形时,它将拉伸该矩形以适合所创建窗口的轮廓,但不适合内部黑色区域。
我的解决方法是将gluOrtho2D设置为使用(-window_left,500 + window_right,0-window_bottom,500 + window_top)投影区域,但仍在(0,0,500,500)处绘制矩形:
gluOrtho2D(0 - 9, 500 + 9, 0 - 9, 500 + 40); // 40 is an empirical value for showing the red rectangle completely