博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opengl编程指南
阅读量:4556 次
发布时间:2019-06-08

本文共 4424 字,大约阅读时间需要 14 分钟。

第一章 opengl简单介绍

1.1 什么是opengl

opengl是图形硬件的一种软件接口。

       1>渲染(rendering)是计算机依据模型创建图像的过程。

2>模型(model)是依据几何图元创建的,也成为物体(object)。

3>几何图元包含点、直线、和多边形等,它们是通过顶点(vertex)指定的。

4>像素是显示硬件能够在屏幕上显示的最小可视元素。

5>OpenGL是一个状态机。

6>OpenGL渲染管线 的一些关键阶段

1. 显示列表

不论什么数据,不论它描写叙述的是几何图元还是像素,都能够保存在显示列表(display list)中,供当前或以后使用。

2. 求值器

全部的几何图元终于都要通过顶点来描写叙述。求值器提供了一种方法,依据控制点计算表示表面的顶点。这样的方法是一种多项式映射,它能够依据控制点产生表面法线、纹理坐标、颜色以及空间坐标值。

3. 基于顶点的操作

把顶点变换为图元

4. 图元装配

图元装配的一个主要内容就是裁剪。

5. 像素操作

6. 纹理装配

OpenGL应用程序能够在几何物体上应用纹理图像,使他们看上去更为逼真。

7. 光栅化

光栅化就是把几何数据和像素数据转换为片段的过程。

8. 片段操作

在数据实际存储到帧缓冲区之前,要运行一系列的操作(纹理处理、測试等)。

7>处理输入事件

1. 能够使用以下这些函数注冊一些回调函数,当指定的事件发生时,这些函数便会被调用

glutReshapeFunc(void(*func)(int w, int h)) 表示当窗体的大小发生改变时应该採取什么行动;

glutKeyboardFunc(void(*func)(unsigned char key, int x, int y))把键盘上的一个键与一个函数相关联,当键被按下或释放时函数被调用;

glutMouseFunc(void(*func)(int button, int state, int x, int y))把鼠标上的一个button与一个函数相关联,当button被按下或释放时函数被调用;

glutMotionFunc(void(*func)(int x, int y))注冊了一个函数,当按下一个鼠标button移动鼠标时,这个函数就会被调用。

8>空暇处理

glutIdleFunc(void(*func)(void));假设向它传递NULL(0),就相当于禁用这个函数。

9>绘制三维物体

圆锥体,立方体、十二面体、二十面体、八面体、球体、茶壶、四面体、圆环面。

10>电影院,每秒24帧 把图片投影到屏幕

11>OpenGL渲染环境是OpenGL在当中存储状态信息的数据结构。

12>模式是特定于应用程序领域的OpenGL功能集的子集。

13>訪问OpenGL函数--找到函数的地址。

范例:

此程序使用了鼠标响应函数和类似重绘的函数。

#include
static GLfloat spin = 0.5;void init(void){ glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_FLAT); //设置着色模式,恒定着色或光滑着色}void display(void){ glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(spin,0.0,0.0,1.0); glColor3f(1.0,1.0,1.0); glRectf(-25.0,-25.0,25.0,25.0); glPopMatrix(); glutSwapBuffers();}void spinDisplay(void){ spin += 2.0; if(spin > 360.0) spin -= 360.0; glutPostRedisplay(); //使每次循环先调用该函数所在函数,然后调用display}void reshape(int w, int h){ glViewport(0, 0, (GLsizei)w, (GLsizei)h); //选择一个所要的画图区域 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();}void mouse(int button, int state, int x, int y){ switch(button) { case GLUT_LEFT_BUTTON: if(state == GLUT_DOWN) glutIdleFunc(spinDisplay); break; case GLUT_MIDDLE_BUTTON: if(state == GLUT_DOWN) glutIdleFunc(0); break; default: break; }}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(250,250); glutInitWindowPosition(100,100); glutCreateWindow(argv[0]); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0;}

第三章 观察

3.1 观察点和矩阵的使用

#include
void init(void){ glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_FLAT);}void display(void){ glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,0.0,0.0); glLoadIdentity(); //清空矩阵 /* 视点变换 */ gluLookAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0); glScalef(1.0,2.0,1.0); //模型变换 glutWireCube(1.0); glFlush();}void reshape(int w, int h){ glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0); glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(200,200); glutCreateWindow("study"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;}

3.4 GLdouble eqn[4] = {0.0, 1.0, 0.0, 0.0};

glClipPlane(GL_CLIP_PLANE0, eqn);

glEnable(GL_CLIP_PLANE0);     就可以删除y轴下部分附载入剪面

#include
void init(void){ glClearColor(0.0,0.0,0.0,0.0); glShadeModel(GL_FLAT);}void display(void){ GLdouble eqn[4] = {0.0,1.0,0.0,0.0}; GLdouble eqn2[4] = {1.0,0.0,0.0,0.0}; glClear(GL_COLOR_BUFFER_BIT); glColor3f(1.0,1.0,1.0); glPushMatrix(); glTranslatef(0.0,0.0,-5.0); /* 截掉下半部分(y坐标小于0的部分)*/ glClipPlane(GL_CLIP_PLANE0,eqn); glEnable(GL_CLIP_PLANE0); /* 截掉下半部分(y坐标小于0的部分)*/ glClipPlane(GL_CLIP_PLANE1,eqn2); glEnable(GL_CLIP_PLANE1); glRotatef(90.0,1.0,0.0,0.0); glutWireSphere(1.0,20,16); glPopMatrix(); glFlush(); }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, 20.0); glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){ glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400,400); glutInitWindowPosition(200,200); glutCreateWindow("study"); init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;}

转载于:https://www.cnblogs.com/mfrbuaa/p/4045748.html

你可能感兴趣的文章
Exp6 信息搜集与漏洞扫描
查看>>
redis4安装
查看>>
使用命令wsimport构建WebService客户端[转]
查看>>
第八遍:链接详解
查看>>
Qt5.5 使用smtp发邮件的各种坑
查看>>
js奇葩错误 字符串传递问题
查看>>
人之初,性本恶
查看>>
springboot 端口号
查看>>
使用AChartEngine画动态曲线图
查看>>
安卓项目五子棋代码详解(四)
查看>>
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
如何生成静态页面的五种方案
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>