opengl编程指南
第一章 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<GL/glut.h> 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<GL/glut.h>
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<GL/glut.h>
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;
}
opengl编程指南的更多相关文章
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- VS15 openGL 编程指南 配置库 triangle例子
最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...
- [转]OpenGL编程指南(第9版)环境搭建--使用VS2017
1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...
- OpenGL编程指南第版本学习笔记 --- OpenGL程序实现过程(win32 + OpenGL)
1. 先上代码 头文件glCommon.h #include <GL/glew.h> #include <GL/GL.h> #include <GL/GLU.h> ...
- OpenGl编程指南第7版(红宝书)环境配制
环境 OS:win7 旗舰版SP1 64位 编译器: VS 2013 express 的cl 软件 glut. 在这个页面https://www.opengl.org/resources/librar ...
- OpenGL编程指南(第九版) Tiangles 学习笔记
////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...
- 《OpenGL编程指南第七版》学习——编译时提示“error C2381: “exit” : 重定义;__declspec(noreturn) 不同”错误的解决办法
解决办法一. #if defined(_WIN32) # ifndef GLUT_BUILDING_LIBextern _CRTIMP void __cdecl exit(int); 上面是glut. ...
- Opengl编程指南第二章:状态管理、几何绘图
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...
随机推荐
- WPF动态改变主题颜色
原文:WPF动态改变主题颜色 国内的WPF技术先行者周银辉曾介绍过如何动态改变应用程序的主题样式,今天我们来介绍一种轻量级的改变界面风格的方式--动态改变主题色. 程序允许用户根据自己的喜好来对界面进 ...
- 无法解析该名称 outlook必须处于联机,控制面板删除账户
无法解析该名称 outlook必须处于联机,控制面板删除账户
- Java设计模式之认识阶段
设计模式是什么? 设计模式(Design pattern)是一套被重复使用.多数人知晓的.经过分类编目的.代码设计经验的总结. 其本质就是继承与接口的组合应用. 为什么要用设计模? 使用设计模式是为了 ...
- twitter 监测登陆活动
http://vicenteaguileradiaz.com/download/tinfoleak/tinfoleak-1.2.tar.gz
- Linux从零到高手的进阶心得(转)
从2006年毕业至今,从事IT行业已经接近8个年头. 一路走来有很多心路历程和技术心得都写在了51CTO的博客中,不少文字现在看来已显稚嫩,但是这正是我真实的成长之路.这八年,从最基础的网络管理员开 ...
- EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean
该jboss集成到eclipse 关掉Jboss控制台新闻Ctrl+c,在MyEclipse→Servers→Jboss可配置JBoss. 通过ANT提高EJB应用的开发效率 在HelloWorld ...
- NET MVC运行机制
[图解ASP.NET MVC运行机制理解-简易版] 很多盆友咨询ASP.NET MVC的机制.网上也有好多.但是都是相当深奥.看的云里雾里的.我今天抽空,整理个简易版本.把处理流程走一遍. 当然, ...
- SQL在declare声明变量
在sql添加的声明变量. declare @local_variable data_type 你需要指定一个变量声明的类型, 能够使用set和select对变量进行赋值, 在sql语句中就能够使用@l ...
- freemarker里的分页--ftl文件的传值
在上一篇<freemarker里的分页--ftl文件>中我们讨论了分页的逻辑,在这一篇文章中,我们開始看一下怎样进行ftl的传值 或许你在上一篇文章中已经发现了端倪.是的,不错,我们须要一 ...
- java多线程Future和Callable类的解释与使用
一,描写叙述 在多线程下编程的时候.大家可能会遇到一种需求,就是我想在我开启的线程都结束时,同一时候获取每一个线程中返回的数据然后再做统一处理,在这种需求下,Future与Callable的组合就派 ...