[译]NeHe教程 - 你的第一个多边形
在第一节中我讲解了如何创建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教程 - 你的第一个多边形的更多相关文章
- [译]NeHe教程 - 创建一个OpenGL窗体
原文: Setting Up An OpenGL Window 欢迎阅读我的OpenGL教程.我是一个热爱OpenGL的普通码农!我第一次听到OpenGL是在3Dfx刚发布他们给Voodoo I显卡的 ...
- [译]NeHe教程 - 添加颜色
原文: Adding Colour 上一节我讲解了如何在屏幕显示三角形和四边形.本节会讲解如何上色.单色(Flat)顾名思义就是只能涂一种实心的颜色.平滑颜色(Smooth)可以在各个顶点混合三种颜色 ...
- (8)nehe教程2-多边形
参考自: http://www.yakergong.net/nehe/ 你的第一个多边形: 在第一个教程的基础上,我们添加了一个三角形和一个四边形.也许你认为这很简单,但你已经迈出了一大步,要知道任何 ...
- [译]Vulkan教程(33)多重采样
[译]Vulkan教程(33)多重采样 Multisampling 多重采样 Introduction 入门 Our program can now load multiple levels of d ...
- [译]Vulkan教程(14)图形管道基础之固定功能
[译]Vulkan教程(14)图形管道基础之固定功能 Fixed functions 固定功能 The older graphics APIs provided default state for m ...
- [译]Vulkan教程(30)深度缓存
[译]Vulkan教程(30)深度缓存 Depth buffering 深度缓存 Introduction 入门 The geometry we've worked with so far is pr ...
- [译]Vulkan教程(28)Image视图和采样器
[译]Vulkan教程(28)Image视图和采样器 Image view and sampler - Image视图和采样器 In this chapter we're going to creat ...
- [译]Vulkan教程(27)Image
[译]Vulkan教程(27)Image Images Introduction 入门 The geometry has been colored using per-vertex colors so ...
- [译]Vulkan教程(26)描述符池和set
[译]Vulkan教程(26)描述符池和set Descriptor pool and sets 描述符池和set Introduction 入门 The descriptor layout from ...
随机推荐
- (寒假集训)洛谷 P2058 海港
小K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客. 小K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况:对于第i艘到达的船,他记录了 ...
- AtCoder - 4130 K-th Substring
Problem Statement You are given a string s. Among the different substrings of s, print the K-th lexi ...
- ORACLE查询当前连接的用户信息及操作的SQL语句
ORACLE--查询当前连接的用户信息及操作的SQL语句 select sid, status, v$session.username 用户名, last_call ...
- c#作业(2班)
第二章 1.编写一个控制台程序,要求: 接受从控制台输入的姓名,如:张三 程序响应:你好,张三. 在代码中使用规范的注释,说明程序的功能 编译程序,并执行. 程序执行效果如下图: using Syst ...
- 在Spring MVC Controller中注入HttpServletRequest对象会不会造成线程安全的问题
做法: 1.比如我们在Controller的方法中,通常是直接将HttpServletRequest做为参数,而为了方便节省代码,通常会定义为全局变量,然后使用@Autowire注入. 说明: 1.观 ...
- JAVA和.NET工作流相关项目收集
.NET以自主实现为主, 暂未发现使用WWF框架开发的开源工作流, java以BPM系为主 . .NET: RoadFlow : http://www.cqroad.cn/ 使用了百度编辑器扩展 ...
- 使用React开发
阅读目录 React的组件生命周期 JSX 语法 父组件传向子组件 子组件传向父(爷)组件 getDefaultProps && getInitialState 获取真实的DOM节点 ...
- Eclipse常用小知识汇总
原文:http://blog.csdn.net/jinzhencs/article/details/50462370 1.修改注释 自动出来的author
- 【报错】spring boot启动 报错 找不到实体类Not a managed type: class com.pisen.cloud.luna.feign.ten.beans.SysUser
Caused by: java.lang.IllegalArgumentException: Not a managed type: class com.pisen.cloud.luna.feign. ...
- ubuntu配置无密码登录
1 本地生成ssh公钥和私钥, 2将公钥拷贝到ubuntu上的.ssh/authorized_keys 中