opengl绘制教室大作业源代码wp

opengl绘制教室大作业源代码wp
opengl绘制教室大作业源代码wp

wp.h

#include // Windows的头文件

#include // 包含OpenGL实用库

#include// 标准输入/输出库的头文件

#include// GLaux库的头文件

#include

#include

#include

#include

//..................................定义变量区............................................................//

//.............................用于场景漫游有关变量........................................//

GLfloat xrot=0.0f;// X 旋转量

GLfloat yrot=0.0f;// Y 旋转量

GLfloat x=0.0f;// X 平移量

GLfloat y=0.0f;// Y 平移量

GLfloat z=-40.0f;// 深入屏幕的距离

//.............................用于键盘操作有关变量.......................................//

BOOL light=TRUE;// 光源的开/关

BOOL lp;// L键按下了么?

BOOL fp;// F键按下了么?

BOOL TurnOn=FALSE; // 开灯GLUquadricObj *qobj;

int fantheta=0; // 风扇转过角度

HGLRC hRC=NULL;// 窗口着色描述表句柄

HDC hDC=NULL;// OpenGL渲染描述表句柄

HWND hWnd=NULL;// 保存我们的窗口句柄

HINSTANCE hInstance;// 保存程序的实例

bool keys[256];// 保存键盘按键的数组

bool active=TRUE;// 窗口的活动标志,缺省为TRUE

bool fullscreen=TRUE;// 全屏标志缺省,缺省设定成全屏模式

//.................................光照材质有关变量......................................//

GLfloat light_Ambient[]= { 0.1f, 0.1f, 0.1f, 1.0f }; // 环境光参数GLfloat light_Diffuse[]= { 1.0f, 1.0f, 0.45f, 1.0f };// 漫射光参数GLfloat light_position[]={0.0,29.9,0.0,1.0}; // 光源位置GLfloat light_position1[]={20.0,29.9,0.0,1.0};

GLfloat mat_ambient[]={0.05f,0.05f,0.05f,1.0f}; // 材质环境光参数

GLfloat mat_specular[]={0.8,1.0,1.0,1.0}; // 材质镜面光参数

GLfloat mat_shininess[]={5.0};

GLfloat white_light[]={1.0,1.0,1.0,1.0}; // 光

GLfloat no_mat[]= {0.0f, 0.0f, 0.0f, 1.0f};// 无材质色

GLfloat no_shininess[]= {0.0f};// 无反光GLfloat mat_diffuse[]= {1.0f, 1.0f, 1.0f, 1.0f};// 漫反射

GLfloat diffusion[]={0.521f,0.121f,0.0547f,1.0};

//......................................纹理...........................................................//

GLuint texture[6];// 7种纹理的储存空间

//.....................................时钟有关变量...................................................//

GLfloat cx=35.0,cy=15.0,cz=-79.9,radius=5.0;

GLfloat hradius=2.0,mradius=3.0,sradius=4.0;

GLfloat sangle,mangle,hangle;

GLuint second,miniter,hour;

char timebuffer[9];

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);// WndProc的定义

wp.cpp

#include"wp.h"

//......................................创建纹理..........................................................//

AUX_RGBImageRec *LoadBMP(char *)// 载入位图图象

{

FILE *;// 文件句柄

if (!)// 确保文件名已提供{

return NULL;// 如果没提供,返回NULL

}

(,"r");// 尝试打开文件

if (File)// 文件存在么?

{

fclose(File);// 关闭句柄

return auxDIBImageLoad();// 载入位图并返回指针

}

return NULL;

}// 如果载入失败,返回NULL

int LoadGLTextures()// 载入位图并转换成纹理

{

int Status=FALSE;// 状态指示器AUX_RGBImageRec *TextureImage[6];// 创建纹理的存储空间

memset(TextureImage,0,sizeof(void *)*1);// 将指针设为NULL

// 载入位图,检查有无错误,如果位图没找到则退出

Status=TRUE;// 将Status 设为TRUE

//...............................创建第一个纹理,地板.......................................//

if (TextureImage[0]=LoadBMP("floor.bmp"))

{

glGenTextures(1, &texture[0]);// 创建纹理

glBindTexture(GL_TEXTURE_2D, texture[0]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);//绑定纹理}

if (TextureImage[0])//纹理是否存在

{

if (TextureImage[0]->data)//纹理图像是否存在

{

free(TextureImage[0]->data);//释放纹理图像占用的内存

}

free(TextureImage[0]);//释放图像结构

}

//...............................创建第二个纹理,墙.......................................//

if (TextureImage[1]=LoadBMP("wall.bmp"))

glGenTextures(1, &texture[1]); //创建纹理

glBindTexture(GL_TEXTURE_2D, texture[1]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[1]->sizeX, TextureImage[1]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[1]->data);//绑定纹理}

if (TextureImage[1])//纹理是否存在

{

if (TextureImage[1]->data)//纹理图像是否存在

{

free(TextureImage[1]->data);//释放纹理图像占用的内存

}

free(TextureImage[1]);//释放图像结构

}

//...............................创建第三个纹理,窗户.......................................//

if (TextureImage[2]=LoadBMP("glass.bmp"))

{

glGenTextures(1, &texture[2]);//创建纹理

glBindTexture(GL_TEXTURE_2D, texture[2]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[2]->sizeX, TextureImage[2]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[2]->data);//绑定纹理}

if (TextureImage[2])//纹理是否存在

{

if (TextureImage[2]->data)//纹理图像是否存在

{

free(TextureImage[2]->data);//释放纹理图像占用的内存

}

free(TextureImage[2]);//释放图像结构

}

//...............................创建第四个纹理,门.......................................//

if (TextureImage[3]=LoadBMP("door.bmp"))

glGenTextures(1, &texture[3]);//创建纹理

glBindTexture(GL_TEXTURE_2D, texture[3]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[3]->sizeX, TextureImage[3]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[3]->data);//绑定纹理}

if (TextureImage[3])//纹理是否存在

{

if (TextureImage[3]->data)//纹理图像是否存在

{

free(TextureImage[3]->data);//释放纹理图像占用的内存

}

free(TextureImage[3]);//释放图像结构

}

//...............................创建第五个纹理,灯.......................................//

if (TextureImage[4]=LoadBMP("lamp.bmp"))

{

Status=TRUE;

glGenTextures(1, &texture[4]);//创建纹理

glBindTexture(GL_TEXTURE_2D, texture[4]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[4]->sizeX, TextureImage[4]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[4]->data);//绑定纹理}

if (TextureImage[4])//纹理是否存在

{

if (TextureImage[4]->data)//纹理图像是否存在

{

free(TextureImage[4]->data);//释放纹理图像占用的内存

}

free(TextureImage[4]);//释放图像结构

}

//...............................创建第六个纹理,黑板.......................................//

if (TextureImage[5]=LoadBMP("blackwall.bmp"))

{

glGenTextures(1, &texture[5]);//创建纹理

glBindTexture(GL_TEXTURE_2D, texture[5]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//远处采用线性滤波

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST );//近处采用MipMapped滤波

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[5]->sizeX, TextureImage[5]->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[5]->data);//绑定纹理}

if (TextureImage[5])//纹理是否存在

{

if (TextureImage[5]->data)//纹理图像是否存在

{

free(TextureImage[5]->data);//释放纹理图像占用的内存

}

free(TextureImage[5]);//释放图像结构

}

return Status;

}

//...................................重置OpenGL窗口大小..............................................//

GLvoid ReSizeGLScene(GLsizei width, GLsizei height)// 重置OpenGL窗口大小{

if (height==0)// 防止被零除

{

height=1;// 将Height设为1 }

glViewport(0, 0, width, height);// 重置当前的视口

glMatrixMode(GL_PROJECTION);// 选择投影矩阵

glLoadIdentity();// 重置投影矩阵

// 设置视口的大小

gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,1000.0f);

glMatrixMode(GL_MODELVIEW);// 选择模型观察矩阵

glLoadIdentity();// 重置模型观察矩阵}

//...................................初始化操作................................................//

int InitGL(GLvoid)// 此处开始对OpenGL进行所有设置

{

if (!LoadGLTextures())// 调用纹理载入子例程

{

return FALSE;// 如果未能载入,返回FALSE

}

glEnable(GL_TEXTURE_2D);// 启用纹理映射

glShadeModel(GL_SMOOTH);// 启用阴影平滑

glClearColor(0.0f, 0.0f, 0.0f, 0.0f);// 黑色背景

glClearDepth(1.0f);// 设置深度缓存

glEnable(GL_DEPTH_TEST);// 启用深度测试

glDepthFunc(GL_LEQUAL);// 所作深度测试的类型

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);// 告诉系统对透视进行修正

glLightModelfv(GL_LIGHT_MODEL_AMBIENT,mat_ambient);

glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER,GL_TRUE);

glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);

glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);

glLightfv(GL_LIGHT1,GL_POSITION,light_position); // 设置光源位置

glLightfv(GL_LIGHT1,GL_AMBIENT,light_Ambient); // 设置环境光

glLightfv(GL_LIGHT1,GL_DIFFUSE,white_light); // 设置漫射光

glLightfv(GL_LIGHT1,GL_SPECULAR,white_light);

glEnable(GL_LIGHTING);

glEnable(GL_LIGHT1);// 启用一号光源glEnable(GL_COLOR_MATERIAL);

glPixelStorei(GL_UNPACK_ALIGNMENT,1); //对齐像素字节函数return TRUE;// 初始化OK

}

//..............................................开始绘制..........................................//

int DrawGLScene(GLvoid)// 从这里开始进行所有的绘制

{

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 清除屏幕和深度缓存

glLoadIdentity();// 重置当前的模型观察矩阵

glTranslatef(x,y,z); //沿X,Y,Z轴移动

glRotatef(xrot,1.0f,0.0f,0.0f);// 绕X轴旋转

glRotatef(yrot,0.0f,1.0f,0.0f);// 绕Y轴旋转

glMaterialfv(GL_FRONT, GL_AMBIENT, no_mat); //选择材质光照glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR, no_mat);

glMaterialfv(GL_FRONT, GL_SHININESS, no_shininess);

glMaterialfv(GL_FRONT, GL_EMISSION, no_mat);

//.............................................房间........................................................//

//.............................................地板........................................................//

glBindTexture(GL_TEXTURE_2D, texture[0]);// 选择纹理

glBegin(GL_QUADS); //开始绘制四边形

glColor3f(1.0f, 1.0f, 1.0f);

glNormal3f(0.0,1.0,0.0); //glNormal3f用于定义点的法向量

glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, -21.0f, -80.0f);//右上

glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);//右下

glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);//左下

glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, -21.0f, -80.0f);//左上

glEnd();

//.............................................天花板......................................................//

glBindTexture(GL_TEXTURE_2D, texture[1]);// 选择纹理

glBegin(GL_QUADS);//开始绘制四边形

glColor3f(1.0f, 1.0f, 1.0f);

glNormal3f(0.0f, -1.0f, 0.0f);//glNormal3f用于定义点的法向量

glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, 30.0f, 40.0f);//左下

glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);//左上

glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);//右上

glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, 30.0f, 40.0f);//右下

glEnd();

//............................................后墙面.......................................................//

glBegin(GL_QUADS);//开始绘制四边形

glColor3f(1.0f, 1.0f, 1.0f);

glNormal3f(0.0f, 0.0f, 1.0f);//glNormal3f用于定义点的法向量

glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);//右上

glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, -80.0f);//右下

glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, -80.0f);//左下

glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);//左上

//............................................前墙面.......................................................//

glNormal3f(0.0f, 0.0f, -1.0f);//glNormal3f用于定义点的法向量

glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, 40.0f);//右上

glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);//右下

glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);//左下

glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, 40.0f);//左上

//............................................左墙面.......................................................//

glNormal3f( 1.0f, 0.0f, 0.0f);//glNormal3f用于定义点的法向量

glTexCoord2f(1.0f, 1.0f);glVertex3f(-50.0f, 30.0f, 40.0f);//右上

glTexCoord2f(1.0f, 0.0f);glVertex3f(-50.0f, -21.0f, 40.0f);//右下

glTexCoord2f(0.0f, 0.0f);glVertex3f(-50.0f, -21.0f, -80.0f);//左下

glTexCoord2f(0.0f, 1.0f);glVertex3f(-50.0f, 30.0f, -80.0f);//左上

//............................................右墙面.......................................................//

glNormal3f(-1.0f, 0.0f, 0.0f);//glNormal3f用于定义点的法向量

glTexCoord2f(1.0f, 1.0f);glVertex3f( 50.0f, 30.0f, -80.0f);//右上

glTexCoord2f(1.0f, 0.0f);glVertex3f( 50.0f, -21.0f, -80.0f);//右下

glTexCoord2f(0.0f, 0.0f);glVertex3f( 50.0f, -21.0f, 40.0f);//左下

glTexCoord2f(0.0f, 1.0f);glVertex3f( 50.0f, 30.0f, 40.0f);//左上

glEnd();

//.............................................桌椅..........................................................//

GLuint i=0;

for(;i<5;i++)//一共五排桌椅

{

//............................................第一张桌椅......................................................//

//..........................桌子的上面.......................//

glPushMatrix();//因为下面要对坐标进行变换,所以先将信息入栈保护,使整个工程的坐标不发生改变

glColor3f(1.0,1.0,0.45);

glTranslatef(30.0f,-10.0f,-30.0+i*9);//平移变换

glScalef(13.0f,0.3f,5.0f);//缩放变换

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照

glutSolidCube(1.0);//绘制立方体

glPopMatrix();//弹出堆栈

//..........................桌子的下面......................//

glPushMatrix();//压入堆栈

glColor3f(1.0,1.0,0.45);

glTranslatef(30.0f,-13.0f,-30.0+i*9);//平移变换

glScalef(11.0f,0.3f,5.0f);//缩放变换

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照

glutSolidCube(1.0);//绘制立方体

glPopMatrix();//弹出堆栈

//...........................桌子的后面......................//

glPushMatrix();//压入堆栈

glColor3f(0.2,0.8,0.8);

glTranslatef(30.0f,-12.0f,-32.5f+i*9);//平移变换

glScalef(11.0f,3.6f,0.3f);//缩放变换

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照

glutSolidCube(1.0);//绘制立方体

glPopMatrix();//弹出堆栈

//...........................桌子的左边桌腿...................//

glPushMatrix();//压入堆栈

glColor3f(0.0,0.0,0.0);

glTranslatef(25.0f,-17.0f,-32.5f+i*9);//平移变换

glScalef(0.5f,8.0f,0.3f);//缩放变换

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照

glutSolidCube(1.0);//绘制立方体

glPopMatrix();//弹出堆栈

//...........................桌子的右边桌腿...................//

glPushMatrix();//压入堆栈

glColor3f(0.0,0.0,0.0);

glTranslatef(35.0f,-17.0f,-32.5f+i*9);//平移变换

glScalef(0.5f,8.0f,0.3f);//缩放变换

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照

glutSolidCube(1.0);//绘制立方体

glPopMatrix();//弹出堆栈

//............................椅子............................//

glPushMatrix();//压入堆栈

glColor3f(0.2,0.8,0.8);

glTranslatef(30.0f,-15.0f,-25.0+i*9);//平移变换

glScalef(11.3f,0.3f,3.5f);//缩放变换

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);//定义材质光照

glutSolidCube(1.0);//绘制立方体

glPopMatrix();//弹出堆栈

//.....................................................第二张桌椅....................................................// //..........................桌子的上面.......................//

glPushMatrix();

glColor3f(1.0,1.0,0.45);

glTranslatef(0.0f,-10.0f,-30.0+i*9);

glScalef(26.0f,0.3f,5.0f);

glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT_AND_DIFFUSE,light_Diffuse);

OpenGL入门学习之七——使用光照来表现立体感

OpenGL入门学习之七——使用光照来表现立体感 2009-01-07 11:49 从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛。人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。因此对于人类而言,光线很大程度上表现了物体的立体感。 请看图1,图中绘制了两个大小相同的白色球体。其中右边的一个是没有使用任何光照效果的,它看起来就像是一个二维的圆盘,没有立体的感觉。左边的一个是使用了简单的光照效果的,我们通过光照的层次,很容易的认为它是一个三维的物体。 图1 OpenGL对于光照效果提供了直接的支持,只需要调用某些函数,便可以实现简单的光照效果。但是在这之前,我们有必要了解一些基础知识。 一、建立光照模型 在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但可以反射来自其它物体的光。这些光通过各种方式传播,最后进入我们的眼睛——于是一幅画面就在我们的眼中形成了。 就目前的计算机而言,要准确模拟各种光线的传播,这是无法做到的事情。比如一个四面都是粗糙墙壁的房间,一盏电灯所发出的光线在很短的时间内就会经过非常多次的反射,最终几乎布满了房间的每一个角落,这一过程即使使用目前运算速度最快的计算机,也无法精确模拟。不过,我们并不需要精确的模拟各种光线,只需要找到一种近似的计算方式,使它的最终结果让我们的眼睛认为它是真实的,这就可以了。 OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。

计算机图形学OpenGL中绘制太阳_地球_月亮的运动模型源代码

#include static int day = 148; // day的变化:从0到359 void myDisplay(void) { glEnable(GL_DEPTH_TEST); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(75, 1, 1, 400000000); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, -200000000, 200000000, 0, 0, 0, 0, 0, 1); // 红色的“太阳” glColor3f(1.0, 0.0, 0.0); glutSolidSphere(69600000, 100, 100); // 蓝色的“地球” glColor3f(0.0, 0.0, 1.0); glRotatef(day/360.0*360.0, 0.0, 0.0, -1.0); glTranslatef(150000000, 0.0, 0.0); glutSolidSphere(15945000, 100, 100); // 黄色的“月亮” glColor3f(1.0, 1.0, 0.0); glRotatef(day/30.0*360.0 - day/360.0*360.0, 0.0, 0.0, -1.0); glTranslatef(38000000, 0.0, 0.0); glutSolidSphere(4345000, 100, 100); glFlush(); glutSwapBuffers(); } void myIdle(void) { ++day; if( day >= 360 ) day = 0; myDisplay(); } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE); glutInitWindowPosition(100, 100); glutInitWindowSize(450, 450);

实验7 OpenGL光照

实验7 OpenGL光照 一、实验目的 了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果。 二、实验内容 (1)下载并运行Nate Robin教学程序包中的lightmaterial 程序,试验不同的光照与材质系数; (2)运行示范代码1,了解光照与材质函数使用。 三、实验原理 为在场景中增加光照,需要执行以下步骤: (1)设置一个或多个光源,设定它的有关属性; (2)选择一种光照模型; (3)设置物体的材料属性。 具体见教材第8章8.6节用OpenGL生成真实感图形的相关内容。 四、实验代码 #include #include static int year =0,day=0; void init(void){ GLfloat mat_specular[]={1.0,1.0,1.0,1.0}; GLfloat mat_shininess[]={50.0}; GLfloat light_position[]={1.0,1.0,1.0,0.0};

GLfloat white_light[]={1.0,1.0,1.0,1.0}; GLfloat Light_Model_Ambient[]={0.2,0.2,0.2,1.0}; glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_SMOOTH); //glMaterialfv(材质指定,单值材质参数,具体指针); glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);//镜面反射光的反射系数 glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);//镜面反射指数 //glLightfv(光源,属性名,属性值); glLightfv(GL_LIGHT0, GL_POSITION, light_position); //光源位置 glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light); //漫放射光分量强度 glLightfv(GL_LIGHT0, GL_SPECULAR, white_light); //折射光强度 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient); //光源2 GL_LIGHT1 GLfloat mat_specular1[]={1.0,1.0,1.0,1.0}; GLfloat mat_shininess1[]={50.0}; GLfloat light_position1[]={0.0,0.0,0.0,0.0}; GLfloat red_light[]={1.0,0.0,0.0,1.0}; GLfloat Light_Model_Ambient1[]={0.2,0.2,0.2,1.0}; glLightfv(GL_LIGHT1, GL_POSITION, light_position1); //光源位置 glLightfv(GL_LIGHT1, GL_DIFFUSE, red_light); //漫放射光分量强度 glLightfv(GL_LIGHT1, GL_SPECULAR, red_light); //折射光强度 glLightModelfv(GL_LIGHT_MODEL_AMBIENT,Light_Model_Ambient1); //开启灯光

简单Opengl时钟时钟源代码 可以运行

#pragma comment(lib, "glut32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "opengl32.lib") #include #include #define PI 3.14159 GLfloat m_rotAngle=0.0; void Display(void) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLineWidth(5); GLfloat i,angle; GLint circle_points = 100; GLint circle_point = 60; glBegin(GL_LINE_LOOP); //绘制闹钟的外圆for (i = 0; i < circle_points; i++) { angle = 2*PI*i/circle_points; glVertex2f(100*cos(angle), 100*sin(angle));

} glEnd(); glBegin(GL_LINE_LOOP); //绘制原点小圆for (i = 0; i < circle_points; i++) { angle = 2*PI*i/circle_points; glVertex2f(cos(angle), sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPointSize(1); glBegin(GL_POINTS); //绘制秒针刻度 for (i = 0; i < circle_point; i++) { angle = 2*PI*i/circle_point; glVertex2f(95*cos(angle), 95*sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPointSize(5); glBegin(GL_POINTS); //绘制时针刻度 for (i = 0; i < 12; i++) { angle = 2*PI*i/12; glVertex2f(95*cos(angle), 95*sin(angle)); } glEnd(); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glColor3f(1.f,1.f,0.f); glPushMatrix(); //绘制秒针 glRotatef(m_rotAngle, 0.0f, 0.0f, 1.0f); glTranslatef(0.0f, 10.0f, 0.0f); glBegin(GL_TRIANGLES); glVertex3f(0, -100, 0); glVertex3f(1, 0, 0); glVertex3f(-1, 0, 0); glEnd(); glPopMatrix(); //绘制分针 glColor3f(1.f,0.f,0.f); glPushMatrix();

第三章光照模型纹理映射

第三章光照模型及纹理映射 基本光照模型 1.在现实生活中,当光照在非透明物体上时,部分光线被物体吸收,剩余的部分光线被反射。人眼依靠这种反射光来感知物体的形状、颜色和其他细节。从光源投向物体的光称为入射光,从物体表面反射回的光称为反射光。 1.1光照模型概述 当光照射到物体表面上时,将出现3种情况: ●光从物体表面反射,形成反射光 ●光穿透物体,形成透射光 ●光被物体吸收,转化成为物体的内能 在上述三种情形的光线中,通常只有前2种情形的光线会对人眼产生视觉效果,使人察觉到物体的色彩变化。 OpenGL用一种近似的光照模型模拟现实世界的光照效果。在该模型中,仅当物体表面吸收和反射光线时,光源才会起做作用。每一个物体表面都假定是由某种特性的材料构成的。一种材料可能发出自己的光线,也可能在各个方向上发散一些射入的光线,还有可能像镜子一样在某个方向强烈地反射入射光。 1.2光照分量 在OpenGL的简化光照模型中,将光照分为4个独立的组成部分:辐射光、环境光、漫反射光和镜面反射光。 1)辐射光

辐射光是直接从物体或光源发出的,不受任何其他光源的影响。 2)环境光 环境光是这样一种光线,它被环境多次反射,以致于连初始 方向也难以确定。这种光线看起来就像来自于所有的方向, 当它照在一个物体表面时,它在所有的方向上等量地反射。 3)漫反射光 在被照射物体表面的反射光中,那些均匀地向各个方向反射 出去的光,称为漫反射光,如黑板反射就属于漫反射光 4)镜面反射光 镜面反射光是指超一定方向的反射光,如点光源照射光滑金 属球表面时,会在球表面形成一个特别亮的区域,呈现所谓 的高亮(Highlight>,这就是光源在该物体表面形成的镜面反射光(Specular Light>。点光源照射表面光滑的物体时,高亮区域小而亮;而点光源照射表面粗糙的物体时,高亮区域大而不亮。 1.3创建光源 光源有许多特性,如颜色、位置、方向等。不同特性的光源,作用在物体上的效果是不一样的。 1.3.1定义一个简单光源 在OpenGL中,定义一个光源是由函数glLight(>来实现的,该函数的原型为:void glLight(GLenum light,GLenum pname>; light为一个光源,pname为光源light指定一个单值的光源参数,

OPenGL的基本程序结构

O p enGL的基本程序结构 常用的程序设计语言,如C、C++、Pascal、Fortran和Java等,都支持OpenGL的开发。这里只讨论C版本下OpenGL的语法。 程序的基本结构 OpenGL程序的基本结构可分为三个部分: 第一部分是初始化部分。主要是设置一些OpenGL的状态开关,如颜色模式(RGBA或ALPHA)的选择,是否作光照处理(若有的话,还需设置光源的特性),深度检验,裁剪等等。这些状态一般都用函数glEnable(???), glDisable(???)来设置,???表示特定的状态。 第二部分设置观察坐标系下的取景模式和取景框位置大小。主要利用了三个函数: 函数void glViewport(left,top,right,bottom):设置在屏幕上的窗口大小,四个参数描述屏幕窗口四个角上的坐标(以象素表示); 函数void glOrtho(left,right,bottom,top,near,far):设置投影方式为正交投影(平行投影),其取景体积是一个各面均为矩形的六面体; 函数void gluPerspective(fovy,aspect,zNear,zFar):设置投影方式为透视投影,其取景体积是一个截头锥体。

第三部分是OpenGL的主要部分,使用OpenGL的库函数构造几何物体对象的数学描述,包括点线面的位置和拓扑关系、几何变换、光照处理等等。 以上三个部分是OpenGL程序的基本框架,即使移植到使用MFC的Windows程序中,也是如此。只是由于Windows自身有一套显示方式,需要进行一些必要的改动以协调这两种不同显示方式。 OpenGL基本函数均使用gl作为函数名的前缀,如glClearColor();实用函数则使用glu作为函数名的前缀,如gluSphere()。 OpenGL基本常量的名字以GL_开头,如GL_LINE_LOOP;实用常量的名字以GLU_开头,如GLU_FILL。一些函数如glColor* ()(定义颜色值),函数名后可以接不同的后缀以支持不同的数据类型和格式。如glColor3b(...)、glColor3d(...)、 glColor3f(...)和 glColor3bv(...)等,这几个函数在功能上是相似的,只是适用于不同的数据类型和格式,其中3表示该函数带有三个参数,b、d、f分别表示参数的类型是字节型、双精度浮点型和单精度浮点型,v则表示这些参数是以向量形式出现的。 OpenGL定义了一些特殊标识符,如GLfloat,GLvoid。它们其实就是C中的 float和void。在gl.h文件中可以看到以下定义: …… typedef float GLfloat; typedef void GLvoid; ……

opengl绘制教室大作业源代码wp

wp.h #include // Windows的头文件 #include // 包含OpenGL实用库 #include// 标准输入/输出库的头文件 #include// GLaux库的头文件 #include #include #include #include //..................................定义变量区............................................................// //.............................用于场景漫游有关变量........................................// GLfloat xrot=0.0f;// X 旋转量 GLfloat yrot=0.0f;// Y 旋转量 GLfloat x=0.0f;// X 平移量 GLfloat y=0.0f;// Y 平移量 GLfloat z=-40.0f;// 深入屏幕的距离 //.............................用于键盘操作有关变量.......................................// BOOL light=TRUE;// 光源的开/关 BOOL lp;// L键按下了么? BOOL fp;// F键按下了么? BOOL TurnOn=FALSE; // 开灯GLUquadricObj *qobj; int fantheta=0; // 风扇转过角度 HGLRC hRC=NULL;// 窗口着色描述表句柄 HDC hDC=NULL;// OpenGL渲染描述表句柄 HWND hWnd=NULL;// 保存我们的窗口句柄 HINSTANCE hInstance;// 保存程序的实例 bool keys[256];// 保存键盘按键的数组 bool active=TRUE;// 窗口的活动标志,缺省为TRUE bool fullscreen=TRUE;// 全屏标志缺省,缺省设定成全屏模式 //.................................光照材质有关变量......................................//

_OpenGL入门教程

OpenGL入门教程 1.第一课: 说起编程作图,大概还有很多人想起TC的#include 吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率、16色来做吗?显然是不行的。 本帖的目的是让大家放弃TC的老旧图形接口,让大家接触一些新事物。 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/1210776443.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL 的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。 Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/1210776443.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/1210776443.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件

实验七 OPENGL光照效果

1.实验七OpenGL光照效果(选做) 1.实验七:OpenGL光照效果。 2.实验目的:通过上机编程,熟悉并掌握OpenGL中光照效果的制造方法。 3.实验要求: (1)先做实验项目:实验六“OpenGL组合图形”。 (2)每人一组,独立完成。 (3)利用OpenGL提供的颜色、光源、材质设置,对实验六“OpenGL组合图形” 中自己设计的物体设置绘制颜色和材质参数,并在场景中添加光源,形成一 定的光照明暗效果。 4.实验原理及内容: 在现实世界中,光线和物体的材质共同决定了物体在人眼中的效果。OpenGL 中则涉及到绘制颜色、物体的材质参数、场景中的光源颜色和位置,以此达到一定 的真实感光照效果。 (1)颜色: OpenGL通过指定红、绿、蓝(RGB)三个成分的各自亮度来确定颜色,有时还有第四个成分alpha:glColor*(red,green,blue[,alpha]); glColor()函数设置当前的绘图颜色,red、green和blue分别为红、绿、蓝的亮度,alpha为透明度,取值均为0.0~1.0。在该函数之后绘制的所有物体都将使用该 颜色。 (2)光线: OpenGL的光照模型中将光源分成四种: 发射光:一个物体本身就是一个发光源,如太阳、电灯等,这种光不受其它任何光源的影响。 环境光:从光源出发后光线被环境多次反射,以致没有明确的方向,或者说来自于所有的方向。被环境光照射的物体,各个表面都均等受光。 散射光:来自于某个方向,被物体表面均匀地反射,例如荧光照明、窗口射入的阳光等。 镜面光:来自于一个方向,被物体强烈地反射到另一个特定的方向。高亮

度的镜面光往往能在被照射的物体表面产生亮斑,如金属球上的高光区。 对于散射光和镜面光,入射角度、距离和衰减因子还会影响到最终的光照效果。 除了物体本身的发射光以外,通常意义上的光并不会是单纯的环境光、散射光或镜面光,而是由这三种类型的光混合组成的。 在OpenGL中,光也是采用RGBA值来定义的,分别描述光线中红绿蓝各成分的相对亮度。计算混合光的亮度时,则把相应的颜色亮度叠加即可,例如:环境光为(R1,G1,B1),散射光为(R2,G2,B2),镜面光为(R3,G3,B3),则混合后的光线为(R1+R2+R3,G1+G2+G3,B1+B2+B3)。 (3)材质: 材质是物体本身的一种属性,主要用来表征物体对不同颜色、不同类型光线的反射、吸收性能。 在OpenGL中设置材质参数,就是要指定这种材质对环境光、散射光、镜面光的反射能力,有时还需要说明该种材质是否具有发光能力。 在最终绘制每个像素时,OpenGL自行将物体材质的各分量与光线的各分量相乘再叠加,从而得到每个像素的RGB值。例如:光线为(R,G,B),材质为(MR,MG, MB),则最终绘制时颜色为(MR*R,MG*G,MB*B)。 (4)获得光照效果的一般过程为: a)使能光照:glEnable(GL_LIGHTING); b)设置一种光照模式:glLightModel*(); 如果只需要普通的无方向的环境光: GLfloat light_ambient[]={red,green,blue,alpha};//环境光的分值 //全局环境光的默认取值为(0.2,0.2,0.2,1.0) glLightModel*(GL_LIGHT_MODEL_AMBIENT,light_ambient); 如果需要在某个具体位置上放置某个光源,例如: GLfloat light_ambient[]={0.3,0.3,0.3,1.0};//环境光 glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient); GLfloat light_diffuse[]={0.7,0.7,0.7,1.0};//散射光 glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse); GLfloat light_specular[]={1.0,1.0,1.0,1.0};//镜面光 glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular);

计算机专业图形学openGL五角星代码

// 填充五角星.cpp : Defines the entry point for the console application. // wujiaoxing.cpp : Defines the entry point for the console application. #include "stdafx.h" #include "gl/glut.h" #include #include #include void display(void){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POL YGON); double y=sin(3.15/5)*tan(3.14/5)-cos(3.14/5); glVertex2f(0,y); glVertex2f(-sin(3.14/5),-cos(3.14/5)); glVertex2f(cos(3.14/10)*y,sin(3.14/10)*y); glVertex2f(-cos(3.14/10),sin(3.14/10)); glVertex2f(sin(3.14/5)*y,-cos(3.14/5)*y); glVertex2f(0,1); glVertex2f(-sin(3.14/5)*y,-cos(3.14/5)*y); glVertex2f(cos(3.14/10),sin(3.14/10)); glVertex2f(-cos(3.14/10)*y,sin(3.14/10)*y); glVertex2f(sin(3.14/5),-cos(3.14/5)); glEnd(); glEnd(); glFlush(); } void init(void) { glClearColor(0.0,0.0,0.0,0.0); glColor3f(255.0,0,0.0); } void main(int argc,char * * argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(0,0); glutCreateWindow("sample"); glutDisplayFunc(display); init();

OpenGL入门学习——第一课 编写第一个OpenGL程序

OpenGL入门学习——第一课编写第一个OpenGL程序 OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。 1、与C语言紧密结合。 OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL 是容易理解和学习的。如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。 2、强大的可移植性。 微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统(现在还要加上一个XBOX游戏机)。而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL的基本命令都做到了硬件无关,甚至是平台无关。 3、高性能的图形渲染。 OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。 总之,OpenGL是一个很NB的图形软件接口。至于究竟有多NB,去看看DOOM3和QUAKE4等专业游戏就知道了。 OpenGL官方网站(英文) https://www.360docs.net/doc/1210776443.html, 下面我将对Windows下的OpenGL编程进行简单介绍。 学习OpenGL前的准备工作 第一步,选择一个编译环境 现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。但这里我们选择Visual Studio 2005作为学习OpenGL的环境。 第二步,安装GLUT工具包 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。Windows环境下的GLUT下载地址:(大小约为150k) https://www.360docs.net/doc/1210776443.html,/resources/libraries/glut/glutdlls37beta.zip 无法从以上地址下载的话请使用下面的连接: https://www.360docs.net/doc/1210776443.html,/upfile/200607311626279.zip Windows环境下安装GLUT的步骤: 1、将下载的压缩包解开,将得到5个文件 2、在“我的电脑”中搜索“gl.h”,并找到其所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\PlatformSDK\include\gl文件夹”)。把解压得到的glut.h放到这个文件夹。 3、把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹(如果是VisualStudio2005,则应该是其安装目录下面的“VC\lib”文件夹)。 4、把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。(典型的位置为:C:\Windows\System32) 第三步,建立一个OpenGL工程 这里以VisualStudio2005为例。 选择File->New->Project,然后选择Win32 Console Application,选择一个名字,然后按OK。

OpenGL光照与材质

OpenGL---------光照的基本知识 从生理学的角度上讲,眼睛之所以看见各种物体,是因为光线直接或间接的从它们那里到达了眼睛。人类对于光线强弱的变化的反应,比对于颜色变化的反应来得灵敏。因此对于人类而言,光线很大程度上表现了物体的立体感。 请看图1,图中绘制了两个大小相同的白色球体。其中右边的一个是没有使用任何光照效果的,它看起来就像是一个二维的圆盘,没有立体的感觉。左边的一个是使用了简单的光照效果的,我们通过光照的层次,很容易的认为它是一个三维的物体。 OpenGL对于光照效果提供了直接的支持,只需要调用某些函数,便可以实现简单的光照效果。但是在这之前,我们有必要了解一些基础知识。 一、建立光照模型 在现实生活中,某些物体本身就会发光,例如太阳、电灯等,而其它物体虽然不会发光,但可以反射来自其它物体的光。这些光通过各种方式传播,最后进入我们的眼睛——于是一幅画面就在我们的眼中形成了。 就目前的计算机而言,要准确模拟各种光线的传播,这是无法做到的事情。比如一个四面都是粗糙墙壁的房间,一盏电灯所发出的光线在很短的时间内就会经过非常多次的反射,最终几乎布满了房间的每一个角落,这一过程即使使用目前运算速度最快的计算机,也无法精确模拟。不过,我们并不需要精确的模拟各种光线,只需要找到一种近似的计算方式,使它的最终结果让我们的眼睛认为它是真实的,这就可以了。 OpenGL在处理光照时采用这样一种近似:把光照系统分为三部分,分别是光源、材质和光照环境。光源就是光的来源,可以是前面所说的太阳或者电灯等。材质是指接受光照的各种物体的表面,由于物体如何反射光线只由物体表面决定(OpenGL中没有考虑光的折射),材质特点就决定了物体反射光线的特点。光照环境是指一些额外的参数,它们将影响最终的光照画面,比如一些光线经过多次反射后,已经无法分清它究竟是由哪个光源发出,这时,指定一个“环境亮度”参数,可以使最后形成的画面更接近于真实情况。 在物理学中,光线如果射入理想的光滑平面,则反射后的光线是很规则的(这样的反射称为镜面反射)。光线如果射入粗糙的、不光滑的平面,则反射后的光线是杂乱的(这样的反射称为漫反射)。现实生活中的物体在反射光线时,并不是绝对的镜面反射或漫反射,但可以看成是这两种反射的叠加。对于光源发出的光线,可以分别设置其经过镜面反射和漫反射后的光线强度。对于被光线照射的材质,也可以分别设置光线经过镜面反射和漫反射后的光线强度。这些因素综合起来,就形成了最终的光照效果。 二、法线向量 在OpenGL中,法线的方向是用一个向量来表示。不幸的是,OpenGL并不会根据你所指定的多边形各个顶点来计算出这些多边形所构成的物体的表面的每个点的法线(这话听着有些迷糊),通常,为了实现光照效果,需要在代码中为每一个顶点指定其法线向量。 指定法线向量的方式与指定颜色的方式有雷同之处。在指定颜色时,只需要指定每一个顶点的颜色,OpenGL就可以自行计算顶点之间的其它点的颜色。并且,颜色一旦被指定,除非再指定新的颜色,否则以后指定的所有顶点都将以这一向量作为自己的颜色。在指定法线向量时,只需要指定每一个顶点的法线向量,OpenGL会自行计算顶点之间的其它点的法线向量。并且,法线向量一旦被指定,除非再指定新的法线向量,否则以后指定的所有顶点都将以这一向量作为自

OpenGL库函数一览表

OpenGL库函数列表 OpenGl核心函数库 glAccum 操作累加缓冲区 glAddSwapHintRectWIN 定义一组被SwapBuffers拷贝的三角形glAlphaFunc允许设置alpha检测功能 glAreTexturesResident 决定特定的纹理对象是否常驻在纹理内存中glArrayElement 定义一个被用于顶点渲染的数组成分 glBegin,glEnd 定义一个或一组原始的顶点 glBindTexture 允许建立一个绑定到目标纹理的有名称的纹理glBitmap 绘制一个位图 glBlendFunc 特殊的像素算法 glCallList 执行一个显示列表 glCallLists 执行一列显示列表 glClear 用当前值清除缓冲区 GlClearAccum 为累加缓冲区指定用于清除的值 glClearColor 为色彩缓冲区指定用于清除的值 glClearDepth 为深度缓冲区指定用于清除的值 glClearStencil 为模板缓冲区指定用于清除的值 glClipPlane 定义被裁剪的一个平面几何体 glColor 设置当前色彩 glColorMask 允许或不允许写色彩组件帧缓冲区 glColorMaterial 使一个材质色彩指向当前的色彩 glColorPointer 定义一列色彩 glColorTableEXT 定义目的一个调色板纹理的调色板的格式和尺寸glColorSubTableEXT 定义目的纹理的调色板的一部分被替换glCopyPixels 拷贝帧缓冲区里的像素 glCopyTexImage1D 将像素从帧缓冲区拷贝到一个单空间纹理图象中glCopyTexImage2D 将像素从帧缓冲区拷贝到一个双空间纹理图象中glCopyTexSubImage1D 从帧缓冲区拷贝一个单空间纹理的子图象glCopyTexSubImage2D 从帧缓冲区拷贝一个双空间纹理的子图象glCullFace 定义前面或后面是否能被精选 glDeleteLists 删除相邻一组显示列表 glDeleteTextures 删除命名的纹理 glDepthFunc 定义用于深度缓冲区对照的数据 glDepthMask 允许或不允许写入深度缓冲区 glDepthRange 定义z值从标准的设备坐标映射到窗口坐标glDrawArrays 定义渲染多个图元 glDrawBuffer 定义选择哪个色彩缓冲区被绘制 glDrawElements 渲染数组数据中的图元 glDrawPixels 将一组像素写入帧缓冲区 glEdgeFlag 定义一个边缘标志数组 glEdgeFlagPointer 定义一个边缘标志数组 glEnable, glDisable 打开或关闭OpenGL的特殊功能

openglD迷宫C实现源代码

o p e n g l D迷宫C实现源 代码 Document serial number【LGGKGB-LGG98YT-LGGT8CB-LGUT-

#include "" #include <> #include <> #include #include <> #include using namespace std; void drawwalls(void); void drawtop(void); void drawball(void); #define IDM_APPLICATION_EXIT (101) #define IDM_APPLICATION_TEXTURE (102) #define IDM_APPLICATION_BANK (103) #define MAZE_HEIGHT (16) #define MAZE_WIDTH (16) #define STARTING_POINT_X ; #define STARTING_POINT_Y ; #define STARTING_HEADING ; float player_x = STARTING_POINT_X ; float player_y = STARTING_POINT_Y ; float player_h = STARTING_HEADING ; // player's heading float player_s = ; // forward speed of the player float player_m = ; // speed multiplier of the player float player_t = ; // player's turning (change in heading) float player_b = ; // viewpoint bank (roll) static float texcoordX=; int walllist=0; int mazelist=0; int balllist=0; int status=1; bool searchroute=false; bool keystate[4]={false,false,false,false}; char mazedata[MAZE_HEIGHT][MAZE_WIDTH] = { {'H','H','H','H','H','H','H','H','H','H','H','H','H',' H','H','H'}, {'H',' ',' ',' ',' ',' ',' ',' ','H',' ',' ',' ',' ',' ',' ','H'}, {'H',' ','H',' ','H','H','H',' ','H',' ','H',' ',' ',' ',' ','H'}, {'H',' ','H','H',' ',' ','H',' ','H','H',' ','H',' ','H',' ','H'}, {'H',' ',' ',' ',' ',' ','H',' ',' ',' ',' ',' ',' ','H',' ','H'}, {'H',' ','H','H','H','H','H','H','H','H','

基于openGl的三维旋转魔方源代码

基于openGl的三维旋转魔方源代码/* * This Code Was Created By Jeff Molofee 2000 * A HUGE Thanks To Fredric Echols For Cleaning Up * And Optimizing The Base Code, Making It More Flexible! * If You've Found This Code Useful, Please Let Me Know. * Visit My Site At https://www.360docs.net/doc/1210776443.html, */ // Header File For Standard Input/Output #include "MoFang.h" HDC hDC=NULL; // Private GDI Device Context HGLRC hRC=NULL; // Permanent Rendering Context HWND hWnd=NULL; // Holds Our Window Handle HINSTANCE h Instance; // Holds The Instance Of The Application bool keys[256]; // Array Used For The Keyboard Routine bool active=TRUE; // Window Active Flag Set To TRUE By Default bool fullscreen=TRUE; // Fullscreen Flag Set To Fullscreen Mode By Default GLfloat xrot; // X Rotation ( NEW ) GLfloat yrot; // Y Rotation ( NEW ) GLfloat zrot; // Z Rotation ( NEW ) GLfloat RX; GLfloat RY; GLuint texture[24]; // Storage For One Texture ( NEW ) GLboolean b_RX,b_RY; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // Declaration For WndProc AUX_RGBImageRec *LoadBMP(char *Filename) // Loads A Bitmap Image { FILE *File=NULL; // File Handle if (!Filename) // Make Sure A Filename Was Given

相关文档
最新文档