0

我想画一条简单的线。所以我有这个代码,如下所示。但是当我运行代码时,我在表单上看不到任何东西。

    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(); 
        }
    }

我应该怎么办?

4

1 回答 1

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
    }
于 2013-07-02T09:22:44.047 回答