没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
#include <windows.h> // Windows 的头文件
#include <glew.h> // 包含最新的 gl.h,glu.h 库
#include <glut.h> // 包含 OpenGL 实用库
第一行设置的变量是 Rendering Context(着色描述表)。每一个 OpenGL 都被连接到一个着色
描述表上。着色描述表将所有的 OpenGL 调用命令连接到 Device Context(设备描述表)上。
我将 OpenGL 的着色描述表定义为 hRC 。要让您的程序能够绘制窗口的话,还需要创建一
个设备描述表,也就是第二行的内容。Windows 的设备描述表被定义为 hDC 。DC 将窗口
连接到 GDI(Graphics Device Interface 图形设备接口)。而 RC 将 OpenGL 连接到 DC。第三
行的变量 hWnd 将保存由 Windows 给我们的窗口指派的句柄。最后,第四行为我们的程序
创建了一个 Instance(实例)。
HGLRC hRC=NULL; // 窗口着色描述表句柄
HDC hDC=NULL; // OpenGL 渲染描述表句柄
HWND hWnd=NULL; // 保存我们的窗口句柄
HINSTANCE hInstance; // 保存程序的实例
下面的第一行设置一个用来监控键盘动作的数组。有许多方法可以监控键盘的动作,但这
里的方法很可靠,并且可以处理多个键同时按下的情况。
active 变量用来告知程序窗口是否处于最小化的状态。如果窗口已经最小化的话,我们可
以做从暂停代码执行到退出程序的任何事情。我喜欢暂停程序。这样可以使得程序不用在
后台保持运行。
fullscreen 变量的作用相当明显。如果我们的程序在全屏状态下运行, fullscreen 的值为
TRUE,否则为 FALSE。这个全局变量的设置十分重要,它让每个过程都知道程序是否运
行在全屏状态下。
bool keys[256]; // 保存键盘按键的数组
bool active=TRUE; // 窗口的活动标志,缺省为 TRUE
bool fullscreen=TRUE; // 全屏标志缺省,缺省设定成全屏模式
现在我们需要先定义 WndProc()。必须这么做的原因是 CreateGLWindow()有对 WndProc()的
引用,但 WndProc()在 CreateGLWindow()之后才出现。在 C 语言中,如果我们想要访问一
个当前程序段之后的过程和程序段的话,必须在程序开始处先申明所要访问的程序段。所
以下面的一行代码先行定义了 WndProc(),使得 CreateGLWindow()能够引用 WndProc()。
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //
WndProc 的定义
下面的代码的作用是重新设置 OpenGL 场景的大小,而不管窗口的大小是否已经改变(假定
您没有使用全屏模式)。甚至您无法改变窗口的大小时(例如您在全屏模式下),它至少仍将
运行一次--在程序开始时设置我们的透视图。OpenGL 场景的尺寸将被设置成它显示时所在
窗口的大小。
GLvoid ReSizeGLScene(GLsizei width, GLsizei height) // 重 置 OpenGL 窗口
大小
{
if (height==0) // 防止被零除
{
height=1; // 将 Height 设为 1
}
glViewport(0, 0, width, height); // 重置当前的视口
下面几行为透视图设置屏幕。意味着越远的东西看起来越小。这么做创建了一个现实外观
的场景。此处透视按照基于窗口宽度和高度的 45 度视角来计算。0.1f,100.0f 是我们在场
景中所能绘制深度的起点和终点。
glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响 projection matrix(投影矩阵)。
投影矩阵负责为我们的场景增加透视。 glLoadIdentity()近似于重置。它将所选的矩阵状态
恢复成其原始状态。调用 glLoadIdentity()之后我们为场景设置透视图。
glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响 modelview matrix(模型观察矩
阵)。模型观察矩阵中存放了我们的物体讯息。最后我们重置模型观察矩阵。如果您还不能
理解这些术语的含义,请别着急。在以后的教程里,我会向大家解释。只要知道如果您想
获得一个精彩的透视场景的话,必须这么做。
glMatrixMode(GL_PROJECTION); // 选择投影矩阵
glLoadIdentity(); // 重置投影矩阵
// 设置视口的大小
gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
glMatrixMode(GL_MODELVIEW); // 选择模型观察矩阵
glLoadIdentity(); // 重置模型观察矩阵
}
接下的代码段中,我们将对 OpenGL 进行所有的设置。我们将设置清除屏幕所用的颜色,
打开深度缓存,启用 smooth shading(阴影平滑),等等。这个例程直到 OpenGL 窗口创建之
后才会被调用。此过程将有返回值。但我们此处的初始化没那么复杂,现在还用不着担心
这个返回值。
int InitGL(GLvoid) // 此处开始对 OpenGL 进行所有设置
{
下一行启用 smooth shading(阴影平滑)。阴影平滑通过多边形精细的混合色彩,并对外部光
进行平滑。我将在另一个教程中更详细的解释阴影平滑。
glShadeModel(GL_SMOOTH); // 启用阴影平滑
下一行设置清除屏幕时所用的颜色。如果您对色彩的工作原理不清楚的话,我快速解释一
下 。 色 彩 值 的 范 围 从 0.0f 到 1.0f 。 0.0f 代 表 最 黑 的 情 况 , 1.0f 就 是 最 亮 的 情 况 。
glClearColor 后的第一个参数是 Red Intensity(红色分量),第二个是绿色,第三个是蓝色。最
大值也是 1.0f,代表特定颜色分量的最亮情况。最后一个参数是 Alpha 值。当它用来清除
屏幕的时候,我们不用关心第四个数字。现在让它为 0.0f。我会用另一个教程来解释这个
参数。
通过混合三种原色(红、绿、蓝),您可以得到不同的色彩。希望您在学校里学过这些。因
此 , 当 您 使 用 glClearColor(0.0f,0.0f,1.0f,0.0f) , 您 将 用 亮 蓝 色 来 清 除屏 幕 。 如 果 您 用
glClearColor(0.5f,0.0f,0.0f,0.0f)的话,您将使用中红色来清除屏幕。不是最亮(1.0f),也不是
最暗 (0.0f)。要得到白色背景,您应该将所有的颜色设成最亮(1.0f)。要黑色背景的话,您
该将所有的颜色设为最暗(0.0f)。
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // 黑色背景
接下来的三行必须做的是关于 depth buffer(深度缓存)的。将深度缓存设想为屏幕后面的层。
深度缓存不断的对物体进入屏幕内部有多深进行跟踪。我们本节的程序其实没有真正使用
深度缓存,但几乎所有在屏幕上显示 3D 场景 OpenGL 程序都使用深度缓存。它的排序决定
那个物体先画。这样您就不会将一个圆形后面的 正方形画到圆形上来。深度 缓存是
OpenGL 十分重要的部分。
glClearDepth(1.0f); // 设置深度缓存
glEnable(GL_DEPTH_TEST); // 启用深度测试
glDepthFunc(GL_LEQUAL); // 所作深度测试的类型
接着告诉 OpenGL 我们希望进行最好的透视修正。这会十分轻微的影响性能。但使得透视
图看起来好一点。
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // 告 诉 系 统
对透视进行修正
最后,我们返回 TRUE。如果我们希望检查初始化是否 OK,我们可以查看返回的 TRUE 或
FALSE 的值。如果有错误发生的话,您可以加上您自己的代码返回 FALSE。目前,我们不
管它。
return TRUE; // 初始化 OK
}
下一段包括了所有的绘图代码。任何您所想在屏幕上显示的东东都将在此段代码中出现。
以后的每个教程中我都会在例程的此处增加新的代码。如果您对 OpenGL 已经有所了解的
话,您可以在 glLoadIdentity()调用之后,返回 TRUE 值之前,试着添加一些 OpenGL 代码
来创建基本的形。如果您是 OpenGL 新手,等着我的下个教程。目前我们所作的全部就是
将屏幕清除成我们前面所决定的颜色,清除深度缓存并且重置场景。我们仍没有绘制任何
东东。
返回 TRUE 值告知我们的程序没有出现问题。如果您希望程序因为某些原因而中止运行,
在返回 TRUE 值之前增加返回 FALSE 的代码告知我们的程序绘图代码出错。程序即将退出。
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清 除 屏 幕
和深度缓存
glLoadIdentity(); // 重置当前的模型观察矩阵
return TRUE; // 一切 OK
}
下一段代码只在程序退出之前调用。KillGLWindow() 的作用是依次释放着色描述表,设备
描述表和窗口句柄。我已经加入了许多错误检查。如果程序无法销毁窗口的任意部分,都
会弹出带相应错误消息的讯息窗口,告诉您什么出错了。使您在您的代码中查错变得更容
易些。
GLvoid KillGLWindow(GLvoid) // 正常销毁窗口
{
我们在 KillGLWindow()中所作的第一件事是检查我们是否处于全屏模式。如果是,我们要
切换回桌面。我们本应在禁用全屏模式前先销毁窗口,但在某些显卡上这么做可能会使得
桌面崩溃。所以我们还是先禁用全屏模式。这将防止桌面出现崩溃,并在 Nvidia 和 3dfx 显
卡上都工作的很好!
if (fullscreen) // 我们处于全屏模式吗?
{
我们使用 ChangeDisplaySettings(NULL,0)回到原始桌面。将 NULL 作为第一个参数,0 作为
第二个参数传递强制 Windows 使用当前存放在注册表中的值(缺省的分辨率、色彩深度、刷
新频率,等等)来有效的恢复我们的原始桌面。切换回桌面后,我们还要使得鼠标指针重新
可见。
ChangeDisplaySettings(NULL,0); // 是的话,切换回桌面
ShowCursor(TRUE); // 显示鼠标指针
剩余14页未读,继续阅读
smart_sun
- 粉丝: 3
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 记录了贪心,动态规划等算法基本思想与设计.zip
- 基于菲阿里基本模型,以及MACD RSI BooL 等技术指标 构建一套基于贪心算法策略的智能投顾模型.zip
- oj算法代码-贪心算法.zip
- 基于yolov8行人检测源码+模型.zip
- 公开整理-地级市-绿色专利申请、授权数据集(2000-2022年).xlsx
- 基于Transformer模型的图像质量评分模型实现源码+详细说明文档.zip
- CST电磁场仿真+线性螺旋电感+建模步骤细节和RLC端口配置+CST高级建模操作
- 大数据库实验的报告材料材料(word文档良心出品).doc
- AIS2024 valid
- 最入门的爬虫代码 python.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论3