NeHe OpenGL教程第二课 你的第一个多边形

在第一课中,我教你如何创建一个OpenGL窗口。在这一课中,我将教你如何绘制三角形和正方形。我们将使用GL_TRIANGLES参数绘制三角形,使用GL_QUADS参数绘制正方形。

使用第一节课中的代码。我们将在DrawGLScene() 函数中添加一些代码。我将在下面重写整个过程。如果你想修改上节课的代码,你只需用下面的代码替换上节课的DrawGLScene() 函数中的代码就可以了,或者把下面代码中上节课没有的部分添加上就可以了。

int DrawGLScene(GLvoid)  //我们绘制图形的地方
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //清除颜色和深度缓存
    glLoadIdentity(); //重置模型视图矩阵
当您调用glLoadIdentity()函数之后,您实际上将当前点移到了屏幕中心,X坐标轴从左至右, Y坐标轴从下至上,Z坐标轴从里至外。

OpenGL屏幕的中心是x轴和y轴的0.0f点。中心左面的坐标值是负值,右面是正值。移向屏幕顶端是正值,移向屏幕底端是负值。移入屏幕深处是负值,移出屏幕则是正值。

依据这个顺序,glTranslatef(x, y, z)函数沿x,y,z轴移动。下面的代码沿x轴向左移动1.5个单位。没有沿y轴移动,移入屏幕6.0个单位。当你移动时,你不是相对于屏幕中心移动,而是相对于当前位置移动。

glTranslatef(-1.5f,0.0f,-6.0f); //向左移动1.5个单位,向屏幕里移动6.0个单位
现在,我们移动到了屏幕的左半边,我们设置了足够的深度(-6.0),以便于当我们绘制三角形时我们可以看见整个的场景。 glBegin(GL_TRIANGLES)函数意味着我们将要绘制一个三角形,glEnd() 函数通知OpenGL我们完成了三角形的绘制。通常情况下,如果你想要三个点,使用 GL_TRIANGLES参数。在大多数的显卡上,绘制三角形的速度相当快。如果你想要四个顶点,使用 GL_QUADS参数更方便。我听说,大多数的显卡都使用三角行渲染对象。

在我们这个简单的程序中,我只绘制一个三角形。如果你想绘制第二个三角形,在前三个点的正下方再添加3行代码。这六行代码都要在 glBegin(GL_TRIANGLES) 函数和 glEnd()函数之间。在一对glBegin(GL_TRIANGLES) 函数和 glEnd()函数之间,每三个点为一组,没有多余的点。这个原则同样适用于正方形。如果你知道你是在绘制正方形,你可以在前四行代码后面再添加一组四行代码。另外,多边形(GL_POLYGON)能够由任意多个点组成,所以在 glBegin(GL_TRIANGLES) 函数和 glEnd()函数之间有多少行代码都可以。

glBegin() 函数后面的第一行代码设置了我们多边形的第一个顶点。glVertex()函数的第一个参数是x轴坐标,第二个参数是y轴坐标,第三个参数是z轴坐标。因此,在第一行代码中,我们没有移动x轴坐标,我们沿y轴移动了一个单位,没有移动z轴坐标。这个是三角形的上顶点。第二行代码沿x轴向左移动一个单位,沿y轴向下移动一个单位。这个是三角形的左下顶点。第三行代码沿x轴向右移动一个单位,沿y轴向下移动一个单位。这个是三角形的右下顶点。glEnd()函数通知OpenGL没有顶点要绘制了。显示我们填充的三角形。

glBegin(GL_TRIANGLES);     //使用GL_TRIANGLES参数绘制三角形
    glVertex3f( 0.0f, 1.0f, 0.0f); //上顶点
    glVertex3f(-1.0f,-1.0f, 0.0f); //左下顶点
    glVertex3f( 1.0f,-1.0f, 0.0f); //右下顶点
glEnd();  //完成三角形绘制
现在,我们的三角形显示在屏幕的左半边。我们需要移动到屏幕的右半边来显示正方形。为了达到这个目的,我们再次使用 glTranslate()函数。这次,我们必须向右移动,所以X参数必须是个正数值。因为我们已经向左移动了1.5个单位,我们需要向右移动1.5个单位到屏幕中心。到达屏幕中心之后,我们还需要向右移动1.5个单位到底屏幕中心的右边。因此,我们一共需要向右移动3.0个单位。
glTranslatef(3.0f,0.0f,0.0f); //向右移动3个单位
然后,我们绘制正方形。我们使用 GL_QUADS参数来绘制。正方形是基本的四边形。能够很好地绘制一个正方形。绘制正方形的代码和绘制三角形的代码非常类似。唯一的区别是用GL_QUADS来替换了GL_TRIANGLES,并且多一一行额外的glVertex3f()函数代码来绘制正方形的第四个顶点。我们以正方形的左上顶点,右上顶点,右下顶点,左下顶点(顺时针顺序)来绘制正方形。以顺时针顺序绘制正方形,绘制的是正方形的背面。意思是说,我们看到的正方形,实际上是正方形的背面。逆时针绘制的对象才是正面朝着我们的。现在这些还不重要,但以后你必须知道。
glBegin(GL_QUADS); //绘制一个正方形
        glVertex3f(-1.0f, 1.0f, 0.0f); // 左上顶点
        glVertex3f( 1.0f, 1.0f, 0.0f); //右上顶点
        glVertex3f( 1.0f,-1.0f, 0.0f);//右下顶点
        glVertex3f(-1.0f,-1.0f, 0.0f);//左下顶点
    glEnd(); //完成正方形绘制
    return TRUE;   //运行
}

最后,修改一下切换窗口\全屏模式部分的代码,以便于窗口有一个合适的标题。
确定你修改的是// Create Our OpenGL Window(就在要修改的代码的上面)注释下面的代码。否则,全屏模式和窗口模式的标题会不一样。
if (keys[VK_F1])  //如果F1被按下
{
    keys[VK_F1]=FALSE;  //设置为FALSE
    KillGLWindow();  //销毁当前的窗口
    fullscreen=!fullscreen;  //切换全屏/窗口模式
    // Recreate Our OpenGL Window ( 修改的部分)
    if (!CreateGLWindow("NeHe's First Polygon Tutorial",640,480,16,fullscreen))
    {
        return 0;  //如果窗口创建失败,程序退出
    }
}


Markus Knauer 添加的额外信息: 在这本书中 ("OpenGL Programming Guide: The Official Guide to Learning OpenGL, Release 1", J. Neider, T. Davis, M. Woo, Addison-Wesley, 1993) ,下面的这段话清楚地解释了NeHe提到的在OpenGL中移动单位的意思。
“【我提到的】英寸和毫米”——这些真的跟OpenGL有关吗?答案是,一个字,不。投影和其它的转换是没有单位限制的。你想要认为最近和最远裁剪平面是位于1.0和2.0米,英寸,千米还是其它的等级之间,由你决定。唯一的原则是,你必须使用一致的测量单位。

原文:
"[I mentioned] inches and millimeters - do these really have anything to do with OpenGL? The answer is, in a word, no. The projection and other transformations are inheritly unitless. If you want to think of the near and far clipping planes as located at 1.0 and 20.0 meters, inches, kilometers, or leagues, it's up to you. The only rule is that you have to use consistent unit of measurement."


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值