opengl: 编程指南例子解析 opengl_wrap
2014-06-26 13:49
357 查看
#include <iostream> using namespace std; #include <GL/glut.h> #include <stdlib.h> #include <stdio.h> #define checkImageWidth 64 //图片宽度 #define checkImageHeight 64 //图片高度 static GLubyte checkImage[checkImageWidth][checkImageHeight][4];//定义图片,RBGA //生成黑白相间的图片 void makeCheckImage(void) { int i, j, c; for (i = 0; i < checkImageHeight; i++) { for (j = 0; j < checkImageWidth; j++) { c = ((((i&0x8)==0)^((j&0x8))==0))*255; checkImage[i][j][0] = (GLubyte) c; checkImage[i][j][1] = (GLubyte) c; checkImage[i][j][2] = (GLubyte) c; checkImage[i][j][3] = (GLubyte) 255; } } } void init(void) { //清空用黑色 glClearColor(0.0, 0.0, 0.0, 0.0); //平滑着色 glShadeModel(GL_FLAT); //启用深度缓存 glEnable(GL_DEPTH_TEST); makeCheckImage(); //设置纹理图片封包解包的对其方式,1字节对齐, 即每行存储的字节数必须是1的整数倍 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); //s,t方向超过1纹理重复 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //当所显示的纹理比加载进来的纹理大或小时,采用GL_NEAREST的方法来处理 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //载入二维纹理图像 glTexImage2D(GL_TEXTURE_2D, 0, 4, checkImageWidth, checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, checkImage); } void reshape(int w, int h) { //设置视口大小 glViewport(0, 0, (GLsizei) w, (GLsizei) h); //载入投影矩阵 glMatrixMode(GL_PROJECTION); //当前矩阵单位化 glLoadIdentity(); //设置透视投影 gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 30.0); //载入模型矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //摄像机在原点,把模型向z轴平移 3.6,不然看不到或看不全。 glTranslatef(0.0, 0.0, -3.6); } void display(void) { //清除深度缓存,颜色缓存 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //启用2d纹理 glEnable(GL_TEXTURE_2D); //设置纹理和材料颜色混合 glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL); //画两个面 glBegin(GL_QUADS); glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, -1.0, 0.0); glTexCoord2f(0.0, 5.0); glVertex3f(-2.0, 1.0, 0.0); glTexCoord2f(5.0, 5.0); glVertex3f(0.0, 1.0, 0.0); glTexCoord2f(5.0, 0.0); glVertex3f(0.0, -1.0, 0.0); glTexCoord2f(0.0, 0.0); glVertex3f(1.0, -1.0, 0.0); glTexCoord2f(0.0, 1.0); glVertex3f(1.0, 1.0, 0.0); glTexCoord2f(1.0, 1.0); glVertex3f(2.41421, 1.0, -1.41421); glTexCoord2f(1.0, 0.0); glVertex3f(2.41421, -1.0, -1.41421); glEnd(); glFlush(); glDisable(GL_TEXTURE_2D); } void keyboard (unsigned char key, int x, int y) { //设置纹理滤波 switch (key) { case 's': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glutPostRedisplay(); break; case 'S': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glutPostRedisplay(); break; case 't': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); glutPostRedisplay(); break; case 'T': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glutPostRedisplay(); break; case 'a': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glutPostRedisplay(); break; case 'A': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glutPostRedisplay(); break; case 'e': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glutPostRedisplay(); break; case 'E': glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glutPostRedisplay(); break; case 27: exit(0); break; default: break; } } int main(int argc, char *argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(250, 250); glutInitWindowPosition(100, 100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0; }
相关文章推荐
- Win32 OpenGL编程系列 2D例子 -- 七巧板图形绘制
- OpenGl 编程指南笔记 第九章:纹理映射 (texture mapping)
- Cocoa+OpenGL编程(一):一个简单的例子
- 【OpenGL编程指南】之状态管理
- 【OpenGL编程指南】之绘制几何物体
- OpenGL编程轻松入门之一个简单的例子
- 【OpenGL编程指南】之投影和视口变换
- OpenGL编程指南---多边形正反面 剔除
- OpenGL编程指南目录
- OpenGL 编程指南
- Opengl 编程指南 第八章 leeds.bin 图片不能显示的问题
- 《OpenGL》编程指南学习开篇
- OpenGL编程指南 - 第一章
- Qt下的OpenGL 编程(11)Qt实例hellogl代码解析
- Quartz 2D编程指南(14) - PDF文档解析
- vs2005下Windows Shell扩展编程完全指南例子一中的问题解决
- OpenGL编程指南之glPolygonStipple函数深入理解
- OpenGL编程指南第六章:混合、反锯齿、雾、多边形偏移
- linux 内核驱动编程 简单例子 与_IO, _IOR, _IOW, _IOWR 宏解析
- 【OpenGL编程指南】之视图和模型变换