原文: Your First Polygon

在第一节中我讲解了如何创建OpenGL窗体.本节我会讲解如何创建三角形和四边形.我们会用GL_TRIANGLES来创建三角形,用GL_GUADS创建四边形.

我们会添加到第一节代码的DrawGLScene函数中.我会下面重新给出该函数的完整代码.如果你打算在上一节的代码中修改,你可以直接用以下代码替换,或者增加上一节代码没有的部分.

int DrawGLScene(GLvoid)                         // Here's Where We Do All The Drawing
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity(); // Reset The View

当你调用glLoadIdentity函数时,前端的动作只是把视觉移回屏幕中间,其实就是在X轴从左到右,在Y轴从上到下,在Z轴从屏幕外部往内部移动.

屏幕的中间是X,Y轴的0.0f.而左边就是负值.右边是正值.向屏幕的顶部移动是正值,向底部移动是负值.向屏幕的深处移动是负值,向观看者移动是正值.

glTranslatef(x, y, z)沿着X, Y和Z轴移动.下面的是在X轴上向左移动了1.5个单位.它在Y轴上没有移动,并往屏幕内部移动了6.0个单位.当你执行时,你会发现并不是从屏幕中间移动,而是从你当前屏幕的位置移动.

glTranslatef(-1.5f,0.0f,-6.0f);                 // Move Left 1.5 Units And Into The Screen 6.0

现在我们需要移动到屏幕的左手边,我们已经设置好足够深入屏幕(-6.0)的视觉,可以看见创建三角形的整个场景.

glBegin(GL_TRIANGLES)的意思是我们要开始绘制三角形,而glEnt()函数告知OpenGL我们已经创建三角形完毕.通常来说,如果你要画3个点的话可以用GL_TRIANGLES.大多数的显卡画三角形都是相当快的.如果你要画4个点可以用GL_QUADS.我听说的是,大多数显卡在后台是以三角形为单位绘制物体的.最后如果你需要绘制超过4个点的话,可以用GL_POLYGON.

在我们的简单演示程序中,我们只画了一个三角形.如果我们需要画第二个三角形,我们可以直接追加三行新的位置代码到原来的三行代码后面.这样6行代码都嵌套在glBegin(GL_TRIANGLES)和glEnd()函数之间.不用每次画3个点都用这两个函数包含一次.四边形也同理,如果你已经知晓你要创建的所有四边形的位置,你可以全部嵌套在glBegin(GL_TRIANGLES)和glEnd()函数之间.另一方面,多边形(GL_POLYGON)可以由任意个点组成,所以你嵌套多少行代码在glBegin(GL_POLYGON)和glEnd()之间都无所谓.

glBegin函数后面的第一行,是设置多边形的第一个点.顶点(glVertex)的第一个数值是X轴的值,第二个值是Y轴,第三个值是Z轴.第一个行中,我们不在X轴和Y轴上移动,只在Y轴上移动一个单位.这个是三角形的顶部的点.第二个顶点(glVertex)在X轴向左移动了一个单位,在Y轴向下移动了一个单位.这个是三角形的左下角的点.第三个顶点(glVertex)向右移动了一个单位,向下移动了一个单位.这个是三角形右下角的点.glEnd()函数告诉OpenGL已经完成画点了.然后填充的三角形会被显示.

glBegin(GL_TRIANGLES);                      // Drawing Using Triangles
glVertex3f( 0.0f, 1.0f, 0.0f); // Top
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glEnd(); // Finished Drawing The Triangle

现在已经有一个三角形显示在屏幕的左边的,我们要在右边显示正方形.为了做这步,要再次调用glTranslate函数.这回是移动到右边,所以X是正值.之前已经向左移动了1.5个单位,这回要向右移动1.5个单位.就是说先会到中间点,然后向右移动1.5个单位.所以总共需要向右移动3.0个单位.

glTranslatef(3.0f,0.0f,0.0f);                   // Move Right 3 Units

现在来创建正方形.会用到GL_QUADS.四边形顾名思义就是有4条边的多边形.四边形属性(GL_GUADS)最适合用来创建正方形.创建正方形的过程和创建三角形很像.就是用GL_GUADS代替GL_TRIANGLES,并且多了一组数值表示正方形的第4个点.我们会以左上,右上,右下,左下(顺时针方向)的顺序绘制.以顺时针的顺序绘制,正方形会被画成一个背面.意思是,我们见到的四边形的边实际上是背面.逆时针绘制物体才是面向我们的.不过这些暂时不重要,这是迟点才需要注意的事.

    glBegin(GL_QUADS);                      // Draw A Quad
glVertex3f(-1.0f, 1.0f, 0.0f); // Top Left
glVertex3f( 1.0f, 1.0f, 0.0f); // Top Right
glVertex3f( 1.0f,-1.0f, 0.0f); // Bottom Right
glVertex3f(-1.0f,-1.0f, 0.0f); // Bottom Left
glEnd(); // Done Drawing The Quad
return TRUE; // Keep Going
}

最后添加窗体/全屏模式的切换快捷键,顺便加上窗体的标题.

记得还要改"//Create Our OpenGL Window"注释那行的代码中的标题.否则"全屏"窗体的标题会和"窗体模式"的标题不同.

if (keys[VK_F1])                // Is F1 Being Pressed?
{
keys[VK_F1]=FALSE; // If So Make Key FALSE
KillGLWindow(); // Kill Our Current Window
fullscreen=!fullscreen; // Toggle Fullscreen / Windowed Mode
// Recreate Our OpenGL Window ( Modified )
if (!CreateGLWindow("NeHe's First Polygon Tutorial",,,,fullscreen))
{
return ; // Quit If Window Was Not Created
}
}

[译]NeHe教程 - 你的第一个多边形的更多相关文章

  1. [译]NeHe教程 - 创建一个OpenGL窗体

    原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...

  2. [译]NeHe教程 - 添加颜色

    原文: Adding Colour 上一节我讲解了如何在屏幕显示三角形和四边形.本节会讲解如何上色.单色(Flat)顾名思义就是只能涂一种实心的颜色.平滑颜色(Smooth)可以在各个顶点混合三种颜色 ...

  3. (8)nehe教程2-多边形

    参考自: http://www.yakergong.net/nehe/ 你的第一个多边形: 在第一个教程的基础上,我们添加了一个三角形和一个四边形.也许你认为这很简单,但你已经迈出了一大步,要知道任何 ...

  4. [译]Vulkan教程(33)多重采样

    [译]Vulkan教程(33)多重采样 Multisampling 多重采样 Introduction 入门 Our program can now load multiple levels of d ...

  5. [译]Vulkan教程(14)图形管道基础之固定功能

    [译]Vulkan教程(14)图形管道基础之固定功能 Fixed functions 固定功能 The older graphics APIs provided default state for m ...

  6. [译]Vulkan教程(30)深度缓存

    [译]Vulkan教程(30)深度缓存 Depth buffering 深度缓存 Introduction 入门 The geometry we've worked with so far is pr ...

  7. [译]Vulkan教程(28)Image视图和采样器

    [译]Vulkan教程(28)Image视图和采样器 Image view and sampler - Image视图和采样器 In this chapter we're going to creat ...

  8. [译]Vulkan教程(27)Image

    [译]Vulkan教程(27)Image Images Introduction 入门 The geometry has been colored using per-vertex colors so ...

  9. [译]Vulkan教程(26)描述符池和set

    [译]Vulkan教程(26)描述符池和set Descriptor pool and sets 描述符池和set Introduction 入门 The descriptor layout from ...

随机推荐

  1. localize by triangle note

    1.当拟合结果不为1时,取和上次相近的作为结果2.python画三角拟合图bug (3.减小三角拟合波动:对激光雷达数据进行滤波等处理)(4.在计算三角起始和结束位置时,添加用距离值过滤) theta ...

  2. Entity Framework贪婪加载筛选问题

    先说一下代码北京,现在有一个Table类,代表桌子,然后Tale里面级联这一系列订单Order,现在要获取这个Table中没有完成的订Order,用完include之后居然发现不知道该怎么写,上网找了 ...

  3. sed 中如何替换换行符

    使用如下解决方案: sed ':a;N;$!ba;s/\n/ /g' 这将在一个循环里读取整个文件,然后将换行符替换成一个空格. 说明: 通过 :a创建一个标记 通过N追加当前行和下一行到模式区域 如 ...

  4. 【视频】Linux高级程序设计01.3命令行选项及参数

    [课程笔记] [命令行参数] 选项:-l -a -i 参数:-l /home main 函数形式: int main(int argc, char *argv[]) main函数是有参数的,而且有返回 ...

  5. SQL Server Profiler和数据库引擎优化顾问

    原文:SQL Server Profiler和数据库引擎优化顾问  简介 说到Sql的[性能工具]真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底 ...

  6. DELPHI7下SUPPEROBJECT遍历子对象的name和value

    DELPHI7下SUPPEROBJECT遍历子对象的name和value var ite: TSuperAvlIterator; while ite.MoveNext do begin if ite. ...

  7. UIWebView to view self signed websites (No private api, not NSURLConnection) - is it possible?

    What it actually does is to intercept the UIWebView to launch a NSURLConnection to allow the server ...

  8. frp -- proxy name [ssh] is already in use

  9. kubernetes1.5.2集群部署过程--安全模式

    使用https安全模式部署kubernetes集群,能保证集群通讯安全.有效限制非授权用户访问.但部署比非安全模式复杂的多. 本文为etcd.kubernetes集群中各个组件配置证书认证,所有组件通 ...

  10. curl 执行post请求

    #curl -l -H "Content-type: application/json;charset=UTF-8" -H "X-Forwarded-For: 20.20 ...