2013-07-02 160 views
0

我想绘制一条简单线条。所以我有这样的代码,如下所示。但是当我运行代码时,我无法在窗体上看到任何东西。在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(); 
     } 
    } 

我该怎么办?

+0

假设您已经发布的代码就是所有你需要的代码,你就错过了很多,比如创建一个OpenGL窗口/背景下,设置视口,并指定投影矩阵。你应该多读一点,看看一些OpenGL教程。 OpenGL不会像这样神奇地用于WinForms。 –

+0

即使在某种程度上它可以正常工作并且可以绘制到窗体上,但您仍然会发现线条的问题远远超出了标准化设备坐标范围,在所有3个坐标轴中都是[-1,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 
    }