原文: 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. Walls and Gates -- LeetCode

    You are given a m x n 2D grid initialized with these three possible values. -1 - A wall or an obstac ...

  2. Codeforces 908 D New Year and Arbitrary Arrangement

    Discription You are given three integers k, pa and pb. You will construct a sequence with the follow ...

  3. extjs combo中给Store插入一条数据

    { xtype: 'combo', columnWidth: .55, name: 'AQLLevel', store: Ext.create('Scripts.Code.Common.store.I ...

  4. VUE -- stylus入门使用方法

    sizes() 15px 10px sizes()[0] // => 15px stylus介绍 是个什么鬼?对于开发来说,CSS的弱点在于静态化.我们需要一个真正能提高开发效率的工具,LESS ...

  5. iOS:新浪微博OAuth认证

    新浪微博OAuth认证   1.资源的授权 •在互联网行业,比如腾讯.新浪,那用户人群是非常巨大的 •有时候要把某些用户资源共享出去,比如第三方想访问用户的QQ数据.第三方想访问用户的新浪微博数据 • ...

  6. 转:Eclipse自动补全功能轻松设置

    Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件 2012-03-08 21:29:02|  分类: Java |  标签:eclipse  自动补全  设置  |举报|字号 订阅   ...

  7. ant安装配置

    点击进入ant官网,找到下载选项. 选择下载安装文件.其余的源文件和手册的下载步骤完全相同. 可以下载官网上对应系统的最新版本.也可以在old ant 版本中选择自己需要的版本.笔者需要ant-1.9 ...

  8. 倍福TwinCAT(贝福Beckhoff)基础教程2.2 TwinCAT常见类型使用和转换_枚举

    在Duts的文件夹上右击,可以声明一个枚举类型,按照格式填写所有类型(注意枚举的元素前面都是逗号,最后一个不需要符号)   在正常使用的时候,枚举的单词可以当全局变量来用     更多教学视频和资料下 ...

  9. CocoaPods安装及相关命令

    具体安装参考: http://www.jianshu.com/p/dfe970588f95 http://www.jianshu.com/p/9e4e36ba8574 我就说一个,安装cocoapod ...

  10. SQL Server 2008 导入MDF数据库文件

    1.将.MDF和.LDF文件拷到SQL Server2008数据目录,如:\\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\ ...