专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »游戏开发 » opengl源代码:通过代码学习OpenGL »正文

opengl源代码:通过代码学习OpenGL

来源: 发布时间:星期四, 2008年9月25日 浏览:264次 评论:0
这是本人学习江超宇翻译的NeHe OpenGL Tutorial 的结果,这个教程新手看很实用,只要你懂一点点OpenGL和WIN32就可以看的很明白.

创建了一个新的 Win32 程序(并非控制台程序) 之后, 链接 OpenGL 的库文件。
操作步骤是: Project-> Settings, 点击 LINK 标签, 在 “Object/Library Modules” 下面那一行的开始处(在kernel32.lib之前) 增添 OpenGL32.lib, GLu32.lib 和 GLaux.lib, 完成之后点击 OK 按钮.
然后把下面的代码贴上去就可以编译了.

/////////////代码
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers

#include <windows.h> // Header File For Windows
#include <stdio.h> // Header File For Standard Input/Output 
#include <stdlib.h>

#include <gl\\gl.h> // Header File For The OpenGL32 Library
#include <gl\\glu.h> // Header File For The GLu32 Library
#include <gl\\glaux.h> // Header File For The GLaux Library

#include <stdio.h>
#include <stdlib.h>

////全局变量//////////////////////////////////////////////////////////////////////////////////
HGLRC           hRC=NULL; //设置一个渲染描述表,将OpenGL调用连接到设备描述表 
HDC             hDC=NULL; //设置一个设备描述表,将窗口连接到 GDI(Graphics Device Interface, 图形设备接口)
HWND           hWnd=NULL; //保存 Windows 分配给程序的窗口句柄
HINSTANCE      hInstance; //保存应用程序实例句柄

bool keys[256]; //用于接收键盘输入的数组,支持同时按下多个键
bool active=TRUE; //程序是否被最小化,当最小化的时候挂起程序
bool fullscreen=TRUE; //是否运行于全屏幕模式,如果运行于窗口模式,它就为FALSE
bool blend=TRUE; //是否打开混合

//浮点数是OpenGL编程中最基本的东西 
GLfloat rtri=0.0f; //保存四凌锥旋转角度
GLfloat rquad=0.0f; //保存立方体旋转角度

GLfloat xrot=0.0f; //控制立方体在x轴上的旋转角度
GLfloat yrot=0.0f; //控制立方体在y轴上的旋转角度
GLfloat zrot=0.0f; //控制立方体在z轴上的旋转角度
GLfloat   xspeed=0.2f; //控制立方体在x轴上的旋转速度
GLfloat   yspeed=0.3f; //控制立方体在x轴上的旋转速度
GLfloat     z=-5.0f; //控制立方体在屏幕中的深度

BOOL light=false; //记录光照是否打开
BOOL lp=false; //键盘上的L键是否被按下?
BOOL fp=false; //键盘上的F键是否被按下?
BOOL bp=false; //键盘上的B键是否被按下?
//设置光照的数组(光照参数)
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; //创建半亮度白色环境光.因为参数都是0.5f,所以是一个介于无光(黑)和全亮(白)的灯光.
//没有环境光的话,漫射光照不到的地方将会非常黑暗

GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; //用于创建一个非常明亮,全亮度的漫射光.所有值都是1.0f,是可以达到的最亮的灯光

//设置光照位置
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f };//前三个参数当然是用于指定其坐标x,y和z,最后一个参数是1.0f告知OpenGL指定的坐标就是光源的位置
//你可以想象显示器的玻璃平面就是z轴上0.0f的平面,把光源放在2.0f的位置上,所以如果你真的能看到这个光源的话,它应该在你的显示器玻璃屏上飘浮着
//当你到达0.0f时,图像看起来会很大,充斥了整个屏幕;而如果你向里到达一个极限值的时候,图像就看不见了

GLuint filter; //用于指定显示哪一个纹理.第一个纹理(纹理0)使用GL_NEAREST过滤(无平滑),第二个纹理(纹理1)使用GL_LINEAR 过滤,得到平滑的图像.第三个纹理(纹理2)使用 mipmap 纹理,创建非常漂亮的纹理外观.默认值0
GLuint texture[3]; //用于给3个不同的纹理创建存储空间
//mipmap纹理按照观察距离选择不同尺寸的纹理,实现多层次的细节.mipmap 纹理显示更好的外观,但占用更多的内存

////函数声明//////////////////////////////////////////////////////////////////////////////////////

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); //声明窗口回调函数 WndProc()

//////函数///////////////////////////////////////////////////////////////////////////////////////////

//纹理图像的宽度和高度必须是2的幂.宽度或高度最小应是64个像素,为了兼容性,最多应是256个像素
AUX_RGBImageRec *LoadBMP(char *Filename) //读入位图文件.果文件不存在将返回NULL值代表文件不能被读取 
{
FILE *File=NULL; //创建一个文件句柄

if (!Filename) //检测文件名是否合法
{
return NULL; //If Not Return NULL
}

File=fopen(Filename,"r"); //检测文件是否存在

if (File) //文件是否存在?
{
fclose(File); //关闭文件
return auxDIBImageLoad(Filename); //返回auxDIBImageLoad(Filename)读入的图像数据。

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: