在OpenGL中绘制一条线

时间:2013-07-02 02:55:52

标签: c# opengl

我想绘制一条简单的线条。所以我有如下所示的代码。但是当我运行代码时,我无法在表单上看到任何内容。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            drawLine();   
        }

        private void drawLine() {
            GL.glClear(GL.GL_COLOR_BUFFER_BIT);
            GL.glBegin(GL.GL_LINES);
            GL.glVertex3f(100.0f, 100.0f, 0.0f); // origin of the line
            GL.glVertex3f(200.0f, 140.0f, 5.0f); // ending point of the line
            GL.glEnd(); 
        }
    }

我该怎么办?

1 个答案:

答案 0 :(得分:2)

OpenGL的默认状态假设视口大小等于上下文首次附加到的窗口的大小。所有矩阵都是身份。因此,您可以有效地绘制所谓的规范化设备坐标(NDC)空间。在该空间中,可见视口的坐标范围为[-1; 1]在任何一个方向。

您的天真代码假设顶点位置以像素为单位。然而,范围之外的一切[-1; 1]位于屏幕外,您的“像素坐标”位于可见视口之外。如果要将像素用作坐标单位,则必须设置视口和投影以使它们与窗口大小匹配。

   private void drawLine() {
        GL.glViewport(0, 0, window_width, window_height);

        GL.glMatrixMode(GL_PROJECTION);
        GL.glLoadIdentity();
        GL.glOrtho(0, window_width, 0, window_height, -1, 1);

        GL.glMatrixMode(GL_MODELVIEW);
        GL.glLoadIdentity();

        GL.glClear(GL.GL_COLOR_BUFFER_BIT);
        GL.glBegin(GL.GL_LINES);
        GL.glVertex3f(100.0f, 100.0f, 0.0f); // origin of the line
        GL.glVertex3f(200.0f, 140.0f, 5.0f); // ending point of the line
        GL.glEnd(); 

        GL.glFlush();

        this.SwapBuffer(); // if the form doesn't automatically swap
    }