for(j=0;j<64;j++){ c=(((i&0x8)==0)^((j&0x8)==0))*255; image[i][j][0]=(GLubyte)c; image[i][j][1]=(GLubyte)c; image[i][j][2]=(GLubyte)c; } }
glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glPixelStorei(GL_UNPACK_ALIGNMENT,1); glEnable(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D,0,3,64,64,0,GL_RGB,GL_UNSIGNED_BYTE,image); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); }
void key(unsigned char k,int x,int y){ Key函数主要功能有: if(k=='1') glutIdleFunc(spinCube); 1、 响应键盘事件,按键‘1’,开始旋转图形 if(k=='2') glutIdleFunc(NULL); 2、 按键‘2’,停止旋转图形 }
void spinCube(void){
spinCube函数主要功能有: theata[axis]+=2.0;
1、 改变当前旋转轴旋转角,限制旋转角在0~360度范围内 if(theata[axis]>360.0)theata[axis]-=360.0;
2、 重新刷新当前窗口 glutPostRedisplay(); }
void mouse(int btn,int state,int x,int y){ if(btn==GLUT_LEFT_BUTTON&&state==GLUT_DOWN) Mouse函数主要功能有: axis=0; 1、 响就鼠标事件 if(btn==GLUT_MIDDLE_BUTTON&&state==GLUT_DOWN) 2、 通过左中右键改变旋转axis=1; 轴 if(btn==GLUT_RIGHT_BUTTON&&state==GLUT_DOWN)
axis=2;
}
void myReshape(int w,int h){
MyReshape函数主要功能有: glViewport(0,0,w,h);
1、 响应窗口变化事件 glMatrixMode(GL_PROJECTION);
2、 设置视口位置和大小 glLoadIdentity();
3、 设置正交视景体,确保绘制图形保持刚性变换 if(w<=h)
4、 设置模型视图矩阵 glOrtho(
5、 自动调用display函数 -2.0, 2.0,
-2.0*(GLfloat)h/(GLfloat)w,2.0*(GLfloat)h/(GLfloat)w,-10.0, 10.0);
else
glOrtho(-2.0*(GLfloat)w/(GLfloat)h,2.0*(GLfloat)w/(GLfloat)h,-2.0,2.0,-10.0,10.0); glMatrixMode(GL_MODELVIEW); }
void display(void){ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity();
Display函数主要功能有:
1、 清除颜色缓冲区和深度缓冲区内容 glRotatef(theata[0],1.0,0.0,0.0);
2、 初始化当前矩阵变换 glRotatef(theata[1],0.0,1.0,0.0);
3、 设置X、Y、Z轴旋转变换矩阵 4、 绘制茶壶 5、 交换前后台缓存内容,执行所有OpenGL命令,并将最后结果在当前窗口中显示出来 glRotatef(theata[2],0.0,0.0,1.0); glutSolidTeapot(1.0); glutSwapBuffers(); }
void main(int argc,char **argv){ glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA|GLUT_DEPTH); glutInitWindowSize(500,500);
glutCreateWindow(\旋转的纹理茶壶...\);
glutReshapeFunc(myReshape); Main函数主要功能有: glutDisplayFunc(display); 1、 初始化OpenGL环境 glutIdleFunc(spinCube); 2、 初始化显示模式为双缓存、RGBA颜色和深度测试 glutMouseFunc(mouse); 3、 初始化创建窗口 glutKeyboardFunc(key); 4、 注册窗口回调函数、显示回调函数、系统空闲回调函数、鼠标回调函 glClearColor(1.0,1.0,1.0,1.0); 数和键盘回调函数 5、 调用初始化函数init init(); 6、 调用窗口消息循环函数,监控窗口事件 glutMainLoop(); }
3、 如右图所示,假定将正方形的4个顶点定义为一个单位圆周上的4个等间隔点,试编写OpenGL程序,
使得正文形能按θ角旋转(注意旋转角θ可自定义大小)。
#include
#define RAD 0.017453 GLfloat theata=0.0;
Void myDisp(void){ glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_POLYGON); glVertex2f(cos(RAD*theata,sin(RAD*theata)); glVertex2f(-sin(RAD*theata),cos(RAD*theata)); glVertex2f(-cos(RAD*theata),-sin(RAD*theata)); glVertex2f(sin(RAD*theata),-cos(RAD*theata)); glEnd(); glFlush(); }
Void myIdle(void){ Theata+=2.0; If(theata>360) theata-=360; glPostRedisplay(); }
Int main(int argc,char ** argv){ glutInit(&argc,argv); glutInitDisplayModel(GLUT_SINGLE|GLUT_RGB); glutInitWindowPosition(0.0); glutInitWindowSize(400,300); glutCreateWindow(“这是一个旋转的矩形!”); glutDisplayFunc(myDisp);
}
glutIdleFunc(myIdle); glutMainLoop();
4、 读下面程序,在右边方框处用文字将程序函数模块主要功能描述出来。(40分)
#include
#include
GLint PWidth,PHeight,MaxVal,PSize; GLfloat scale; GLuint * image;
void getPic(void){
getPic() 函数主要功能: GLuint err;
FILE * fd; 1、 从PPM文件中获取图片数据,并保存在数组image中; GLint i;
2、 指定纹理缩放因子scale的大小。 char c; char b[100]; wchar_t d[100]; GLint red,green,blue; printf(\请输入PPM文件名:\\n\ scanf_s(\ err=fopen_s(&fd,b,\ if(err){ swprintf_s(d,sizeof(d),L\错误代码是:%d\ MessageBox(NULL,d,L\提示!\ exit(0); } fscanf_s(fd,\ if(b[0]!='P'||b[1]!='3'){ printf(\ exit(0); } printf(\ fscanf_s(fd,\ while(c=='#'){ fscanf_s(fd,\ printf(\ fscanf_s(fd,\ } ungetc(c,fd); fscanf_s(fd,\ PSize=PWidth*PHeight; image=(GLuint *)malloc(3*sizeof(GLuint)*PSize); for(i=0;i } scale=255./MaxVal; } void init(void){ init() 函数主要功能: glClearColor(0.0,0.0,0.0,1.0); 1、 清除背景颜色为黑色,指定当前绘制颜色为白色; glColor3f(1.0,1.0,1.0); 2、 设置二维纹理映射参数。 glEnable(GL_TEXTURE_2D); glPixelTransferf(GL_RED_SCALE,scale); glPixelTransferf(GL_GREEN_SCALE,scale); glPixelTransferf(GL_BLUE_SCALE,scale); glPixelStorei(GL_UNPACK_SWAP_BYTES,GL_TRUE); glPixelStorei(GL_UNPACK_ALIGNMENT,1); glTexImage2D(GL_TEXTURE_2D,0,3,PHeight,PWidth,0,GL_RGB,GL_UNSIGNED_INT,image); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); } void Quads(void){ Quads() 函数主要功能: glBegin(GL_QUADS); glTexCoord2f(0.0,0.0); 1、 绘制四边形 glVertex2i(0,0); 2、 对每个四边形顶点指定一个纹理坐标 glTexCoord2f(0.0,1.0); glVertex2i(0,PWidth-1); glTexCoord2f(1.0,1.0); glVertex2i(PHeight-1,PWidth-1); glTexCoord2f(1.0,0.0); glVertex2i(PHeight-1,0); glEnd(); myReshape() 函数主要功能: } 1、 响应窗口大小缩放事件 2、 设置窗口中视口的大小和位置 void myreshape(int w,int h){ glViewport(0,0,w,h); 3、 设置正交投影矩阵,投影大小正好是图片的宽度和高度 4、 设置模型视图变换矩阵,并初始化为单位矩阵 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,(GLfloat)PWidth,0.0,(GLfloat)PHeight); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } display() 函数主要功能: 1、 响应窗口显示事件 void display(void){ 2、 清除颜色缓冲区内容 glClear(GL_COLOR_BUFFER_BIT); 3、 绘制带纹理的四边形 Quads(); 4、 立即执行所有OpenGL命令,将图元显示在当前窗口的当前 glFlush(); } 视口中 int main(int argc,char **argv){ getPic(); glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB); glutInitWindowSize(PWidth,PHeight); glutInitWindowPosition(0,0); glutCreateWindow(\背景图片示例...\ glutReshapeFunc(myreshape); glutDisplayFunc(display); init(); glutMainLoop(); } main() 函数主要功能: 1、 为执行文件调用主函数提供唯一入口 2、 调用getPic()函数,设置image纹理数据 3、 初始化OpenGL环境 4、 创建应用程序窗口 5、 注册窗口大小缩放回调函数和显示回调函数 6、 调用init()初始化函数 7、 系统进入窗口事件循环监听状态 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库OpenGL试题库(2)在线全文阅读。
相关推荐: