• 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;
    }

  • 相关阅读:
    Java Arrays.asList注意事项
    从给定的N个正数中选取若干个数之和最接近M
    java 8 foreach获取索引
    更优雅地关闭资源
    idea 下获取路径下文件的方法
    IDEA类和方法注释模板设置(非常详细)
    503 Error: need EHLO and AUTH first
    fatal error C1083: Cannot open include file: 'openssl/opensslv.h'
    'pip' 不是内部或外部命令
    JS中every()和some()的用法
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4045748.html
Copyright © 2020-2023  润新知