我想绘制一条简单的线条。所以我有如下所示的代码。但是当我运行代码时,我无法在表单上看到任何内容。
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 :(得分: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
}