OpenGL图形编程2基本图形绘制(陈永强)

合集下载

计算机图形学陈永强PPT课件

计算机图形学陈永强PPT课件

点光源
N
L
8
第8页/共60页
P
图2 漫反射
漫反射光(Diffuse Reflection)
对于彩色
I p (I pR , I pG , I pB )
IdR I pR KdR (L N )
IdG I pG KdG (L N )
IdB I pB KdB (L N )
对于多个漫反射光源
Ks (KsR , KsG , KsB )
16
第16页/共60页
颜色
光强计算公式:
n
n
I R IaR KaR f (di )I pR,i KdR (Li N ) f (di )I pR,i KsR (Hi N )n
i 1
i 1
n
n
IG IaG KaG f (di )I pG,i KdG (Li N ) f (di )I pG,i KsG (Hi N )n
37
第37页/共60页
Whitted光照模型
Whitted在简单光照模型中增加了环境镜面反
射光和环境规则透射光,以模拟周围环境的光投
射在景物表面上产生的理想镜面反射和规则透射
现象。
R
N
I Ilocal Ks I s Kt It
V 视点
T
图11 物体表面的镜面反射和透射
38
第38页/共60页
对于每一像素光线,对场景中的所有物体表面进 行测试以确定其是否与该光线相交,并计算出交 点的深度,深度最大(z值)的交点即为该像素 对应的可见点。然后,继续考察通过该可见点的 从属光线(Secondary Rays)。
40
第40页/共60页
光线跟踪算法步骤
对每条从属光线重复过程:与场景中的所有物体 求交。然后递归地在沿从属光线方向最近的物体 表面上生成下一折射和反射光线。当由每个像素 出发的光线在场景中被反射和折射时,逐个将相 交物体表面加入到一个二叉光线跟踪树中。当树 中的一束光线到达预定的最大深度或到达某光源 时,就停止跟踪。

OpenGL入门学习之二——绘制几何图形

OpenGL入门学习之二——绘制几何图形
三、开始绘制
假设现在我已经指定了若干顶点,那么 OpenGL 是如何知道我想拿这些顶点来干什么呢?是 一个一个的画出来,还是连成线?或者构成一个ቤተ መጻሕፍቲ ባይዱ边形?或者做其它什么事情?
为了解决这一问题,OpenGL 要求:指定顶点的命令必须包含在 glBegin 函数之后,glEnd 函 数之前(否则指定的顶点将被忽略)。并由 glBegin 来指明如何使用这些点。 例如我写: glBegin(GL_POINTS);
OpenGL 入门学习之二——绘制几何图形 2009-01-07 11:25 一、点、直线和多边形 我们知道数学(具体的说,是几何学)中有点、直线和多边形的概念,但这些概念在计算机 中会有所不同。 数学上的点,只有位置,没有大小。但在计算机中,无论计算精度如何提高,始终不能表示 一个无穷小的点。另一方面,无论图形输出设备(例如,显示器)如何精确,始终不能输出 一个无穷小的点。一般情况下,OpenGL 中的点将被画成单个的像素(像素的概念,请自己 搜索之~),虽然它可能足够小,但并不会是无穷小。同一像素上,OpenGL 可以绘制许多 坐标只有稍微不同的点,但该像素的具体颜色将取决于 OpenGL 的实现。当然,过度的注意 细节就是钻牛角尖,我们大可不必花费过多的精力去研究“多个点如何画到同一像素上”。 同样的,数学上的直线没有宽度,但 OpenGL 的直线则是有宽度的。同时,OpenGL 的直线 必须是有限长度,而不是像数学概念那样是无限的。可以认为,OpenGL 的“直线”概念与 数学上的“线段”接近,它可以由两个端点来确定。 多边形是由多条线段首尾相连而形成的闭合区域。OpenGL 规定,一个多边形必须是一个 “凸多边形”(其定义为:多边形内任意两点所确定的线段都在多边形内,由此也可以推导 出,凸多边形不能是空心的)。多边形可以由其边的端点(这里可称为顶点)来确定。(注 意:如果使用的多边形不是凸多边形,则最后输出的效果是未定义的——OpenGL 为了效率, 放宽了检查,这可能导致显示错误。要避免这个错误,尽量使用三角形,因为三角形都是凸 多边形)

OpenGL编程精粹

OpenGL编程精粹

《OpenGL编程精粹》实验报告班级:计科083姓名:许银学号:0804641004指导教师:陈永强2011 年6 月 4 日一、实验目的通过本实验,使自己了解OpenGL的有关原理、算法及系统,掌握基本图形学显示程序设计方法,及三维图形程序设计方法,还要学习OpenGL光源、光照模型、物体材质、明暗处理、深度测试等生成真实世界的基本方法,为进一步学习计算机辅助设计方面的设计知识打下基础,同时通过此课程设计提高动手实践能力和学习分析能力。

二、实验要求这次课程设计的要求是通过OpenGL编程,模拟太阳、地球、月亮三者之间公转与自转的运动关系。

三、开发环境基于OpenGL的Microsoft Visual C++ 6.0四、实验内容//外部变量定义static GLfloat a = 3.5;static GLfloat b = 2;static GLfloat x = 0.0;static GLfloat y = 2.0;static GLfloat spin = 0.0;static GLfloat right = 0.0;static GLfloat left = 0.0;static GLfloat up = 0.0;static GLfloat down = 0.0;static sun_rotate = 0.0;static m = 0.0;static n = 0.0;static m_spin = 0.0;static m_x = 1.0;static m_y = 0.0;void sunfunc(void){sun_rotate+=2.0;if(sun_rotate>360.0)sun_rotate-=360.0;glutPostRedisplay();}{right+=2.0;if(right>360)right-=360;glutPostRedisplay(); }void leftfunc(void) {left+=2.0;if(left>360)left-=360;glutPostRedisplay(); }void upfunc(void) {up+=2.0;if(up>360.0)up-=360.0;glutPostRedisplay(); }void downfunc(void) {down+=2.0;if(down>360.0)down-=360.0;glutPostRedisplay(); }void spinfunc(void) {spin+=0.006;if(spin>360)spin-=360.0;x=a*sin(spin);y=b*cos(spin);glutPostRedisplay(); }{m_spin+=2;if(m_spin>360.0)m_spin-=360;m_x=sin(m_spin);m_y=cos(m_spin);glutPostRedisplay();}//初始化void init(void){//设置背景色glClearColor(0.0, 0.0, 0.0, 0.0);//设置平滑着色glShadeModel(GL_SMOOTH);//启用深度测试消隐glEnable(GL_DEPTH_TEST);//全局环境光GLfloat model_ambient[]={0.1,0.1,0.1,1.0};//光源位置GLfloat light_position[]={1.0, 1.0, 1.0, 0.0};//光的环境强度 GLfloat light_ambient[]={1.0, 1.0, 1.0, 1.0};//光的散射强度GLfloat light_diffuse[]={1.0, 1.0, 1.0, 1.0};//光的镜面强度GLfloat light_specular[]={1.0, 1.0, 1.0, 1.0};//设置背景色glClearColor(0.0, 0.0, 0.0, 0.0);//设置平滑着色glShadeModel(GL_SMOOTH);//启用深度测试消隐glEnable(GL_DEPTH_TEST);glLightfv(GL_LIGHT0,GL_POSITION,light_position);glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse);//光照模型glLightModelfv(GL_LIGHT_MODEL_AMBIENT,model_ambient);//启用光照 glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);//启用混合glEnable(GL_BLEND);//启用抗锯齿glEnable(GL_POINT_SMOOTH);glEnable(GL_LINE_SMOOTH);glEnable(GL_POLYGON_SMOOTH);//启用雾// glEnable(GL_FOG);}//回调void display(void){//地球材质属性GLfloat mat_ambient[] = { 0.2, 0.2, 0.9, 1.0 };GLfloat mat_diffuse[] = { 0.2, 0.2, 0.9, 1.0 };GLfloat mat_specular[] = { 0.2, 0.1, 0.8, 1.0 };GLfloat mat_shininess[] = { 10.0 };GLfloat mat_emission[] = {0.1, 0.1, 0.1, 0.0};//太阳材质属性GLfloat sun_ambient[] = { 0.9, 0.2, 0.1, 1.0 };GLfloat sun_diffuse[] = { 0.9, 0.2, 0.2, 1.0 };GLfloat sun_specular[] = { 0.9, 0.3, 0.1, 1.0 };GLfloat sun_shininess[] = { 20.0 };GLfloat sun_emission[] = {0.1, 0.1, 0.1, 0.0};//月球材质属性GLfloat mom_ambient[] = { 0.5, 0.5, 0.5, 1.0 };GLfloat mom_diffuse[] = { 0.5, 0.5, 0.5, 1.0 };GLfloat mom_specular[] = { 0.5, 0.5, 0.5, 1.0 };GLfloat mom_shininess[] = { 50.0 };GLfloat mom_emission[] = {0.1, 0.1, 0.1, 0.0};glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor4f(1.0,1.0,1.0,0.0);glPushMatrix();glPushMatrix();glEnable(GL_LIGHTING);//设置太阳材质属性glMaterialfv(GL_FRONT, GL_AMBIENT, sun_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, sun_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, sun_specular); glMaterialfv(GL_FRONT, GL_SHININESS, sun_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, sun_emission); //太阳自传sunfunc();glRotatef(sun_rotate,1.0,1.0,0.0);glutSolidSphere(0.8,100,100);glPopMatrix();//轨道旋转glRotatef(right, 0.0, 1.0, 0.0);glRotatef(-left, 0.0, 1.0, 0.0);glRotatef(-up, 1.0, 0.0, 0.0);glRotatef(down, 1.0, 0.0, 0.0);glPushMatrix();glTranslatef(x,y,0);glEnable(GL_LIGHTING);//地球材质设置glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);glutSolidSphere(0.3, 100, 100);glDisable(GL_LIGHTING);glutSolidTorus(0.004,0.56,100,100);glPushMatrix();{glRotatef(-m_spin,0,0,1);glTranslatef(0.4,0.4,0);m_spinfunc();glEnable(GL_LIGHTING);//月球材质设定glMaterialfv(GL_FRONT, GL_AMBIENT, mom_ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, mom_diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, mom_specular); glMaterialfv(GL_FRONT, GL_SHININESS, mom_shininess); glMaterialfv(GL_FRONT, GL_EMISSION, mom_emission); glutSolidSphere(0.14,100,100);}glPopMatrix();glPopMatrix();glPushMatrix();//绘制轨道禁用光照glDisable(GL_LIGHTING);glScalef(a/b,1.0,1.0);glutSolidTorus(0.003,2.0,100,100);glPopMatrix();glPopMatrix();glutSwapBuffers();}//窗口变化函数void reshape(int w,int h){//视口变换glViewport( 0, 0, (GLsizei)w,(GLsizei)h);//选择投影矩阵glMatrixMode(GL_PROJECTION);//重置投影矩阵glLoadIdentity();//正投影if(w>=h)glOrtho(-3.0*(GLfloat)w/(GLfloat)h, 3.0*(GLfloat)w/(GLfloat)h, -3.0, 3.0, -10.0, 10.0);elseglOrtho(-3.0, 3.0, -3.0*(GLfloat)w/(GLfloat)h,3.0*(GLfloat)w/(GLfloat)h, -10.0, 10.0);//透视投影// gluPerspective(45.0, (GLfloat)w/(GLfloat)h, 1.0, 100.0);//选择模型视图矩阵glMatrixMode(GL_MODELVIEW);//重置模型视图矩阵glLoadIdentity();//下面可以设置观察点 glLookAt() 或是变换场景局部坐标系glTranslate() glRotate() glScale()// gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);}//鼠标响应void mouse(int button, int state, int x, int y){switch(button){case GLUT_LEFT_BUTTON:if(state==GLUT_DOWN)glutIdleFunc(spinfunc);break;case GLUT_RIGHT_BUTTON:if(state==GLUT_DOWN)glutIdleFunc(m_spinfunc);break;case GLUT_MIDDLE_BUTTON:if(state==GLUT_DOWN)break;}}//主函数int main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(850,600);glutInitWindowPosition(100,100);glutCreateWindow(argv[0]);init();glutReshapeFunc(reshape);glutMouseFunc(mouse);glutKeyboardFunc(keyboard);glutDisplayFunc(display);glutMainLoop();return 0;}实验结果如下:五、实验总结及心得体会通过这次实验,使我学习了更多的基于OpenGL的编程方法,在实验过程中多多少少出现过各式各样的问题,我也不断在学习解决这些问题,编程就是要将理论付诸于实践,二者相辅相成,所以要多多练习OpenGL的编程,提高自己的编程能力,同时不断地掌握新的理论知识。

OpenGL入门学习之二——绘制几何图形

OpenGL入门学习之二——绘制几何图形

字母表示参数的类型s表示16位整数opengl中将这个类型和glsizei表示32位浮点数opengl中将这个类型定义为glfloat表示64位浮点数opengl中将这个类型定义为gldouble表示传递的几个参数将使用指针的方式见下面的例子
(四)glVertex4f(1.0f, 3.0f, 0.0f, 1.0f); (五)GLfloat VertexArr3[] = {1.0f, 3.0f, 0.0f};
glVertex3fv(VertexArr3); 以后我们将用 glVertex*来表示这一系列函数。 注意:OpenGL 的很多函数都是采用这样的形式,一个相同的前缀再加上参数说明标记,这 一点会随着学习的深入而有更多的体会。
A EB
DC 首先,根据余弦定理列方程,计算五角星的中心到顶点的距离 a (假设五角星对应正五边形的边长为.0) a = 1 / (2-2*cos(72*Pi/180)); 然后,根据正弦和余弦的定义,计算 B 的 x 坐标 bx 和 y 坐标 by,以及 C 的 y 坐标 (假设五角星的中心在坐标原点) bx = a * cos(18 * Pi/180); by = a * sin(18 * Pi/180); cy = -a * cos(18 * Pi/180); 五个点的坐标就可以通过以上四个量和一些常数简单的表示出来 */ #include <math.h> const GLfloat Pi = 3.1415926536f; void myDisplay(void) {
i 表示 32 位整数(OpenGL 中将这个类型定义为 GLint 和 GLsizei), f 表示 32 位浮点数(OpenGL 中将这个类型定义为 GLfloat 和 GLclampf), d 表示 64 位浮点数(OpenGL 中将这个类型定义为 GLdouble 和 GLclampd)。 v 表示传递的几个参数将使用指针的方式,见下面的例子。 这些函数除了参数的类型和个数不同以外,功能是相同的。例如,以下五个代码段的功能是 等效的: (一)glVertex2i(1, 3); (二)glVertex2f(1.0f, 3.0f); (三)glVertex3f(1.0f, 3.0f, 0.0f);

OpenGL基本图形的绘制

OpenGL基本图形的绘制

OpenGL基本图形的绘制1.使用glColor,glPointSize函数绘制三个不同颜色和大小的点// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glPointSize(5.0f);glBegin(GL_POINTS);glColor3f(1.0,0.0,0.0);glVertex2f(0.3f,0.5f);glEnd();glPointSize(8.0f);glBegin(GL_POINTS);glColor3f(0.0,1.0,0.0);glVertex2f(0.0f,0.0f);glEnd();glPointSize(10.0f);glBegin(GL_POINTS);glColor3f(0.0,0.0,1.0);glVertex2f(-0.3f,-0.5f);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB); glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Three Point");glutDisplayFunc(&Display);glutMainLoop();return 0;}2.使用glColor,glLineWidth,glLineStripple函数绘制实心、虚线及渐变色线(1)实心线// T.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(2,0xFFFF);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Solid Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(2)虚线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid Display(void) {glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glShadeModel(GL_SMOOTH);glLineStipple(4,0xAAAA);glLineWidth(2);glBegin(GL_LINES);glVertex2i(-100,0);glVertex2i(100,0);glEnd();glFlush();}int main(int argc,char* argv[]) {glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowPosition(200,200);glutInitWindowSize(400,400);glutCreateWindow("Dotted Line");glutDisplayFunc(&Display);glutMainLoop();return 0;}(3)渐变线// T.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includeGLuint Line;void Initial(void) {glClearColor(0.0f, 0.0f, 0.0f, 0.0f);Line = glGenLists(1);glNewList(Line, GL_COMPILE);glTranslatef(-50.0, 20.0, 0.0);glColor3f(255.0, 0.0, 0.0);glLineWidth(2);glBegin(GL_LINES);glColor3f(255.0, 0.0, 0.0);glVertex2i(0,-20);glColor3f(0.0, 0.0, 255.0);glVertex2i(100,-20);glEnd();glEndList();void ChangeSize(int w, int h) {glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D (-70.0f, 70.0f, -70.0f, 70.0f);}void Display(void) {glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0, 0.0, 0.0);glCallList(Line);glFlush();}int main(int argc, char* argv[]) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(600,450);glutInitWindowPosition(100,100);glutCreateWindow("渐变色线");glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return 0;}3.使用glColor,glPolygonMode函数绘制纯色、渐变色、轮廓多边形(1)纯色六边形// a.cpp : Defines the entry point for the console application.//#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("纯色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(2)渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0);glMatrixMode (GL_PROJECTION);gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300);glutCreateWindow("渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop();}(3)轮廓渐变色六边形// a.cpp : Defines the entry point for the console application. //#include "stdafx.h"#includevoid init(){glClearColor (1.0, 1.0, 1.0, 0.0); glPolygonMode (GL_FRONT_AND_BACK,GL_LINE); gluOrtho2D (0.0, 200.0, 0.0, 150.0);}void polygon(void){glClear(GL_COLOR_BUFFER_BIT);int p1 [] = {20, 75};int p2 [] = {60, 5};int p3 [] = {140, 5};int p4 [] = {180, 75};int p5 [] = {140, 145};int p6 [] = {60, 145};glColor3f(0.0, 0.5, 1.0);glBegin(GL_POLYGON);glColor3f(0.0,0.0,1.0);glVertex2iv(p1);glColor3f(0.0,1.0,0.0);glVertex2iv(p2);glColor3f(1.0,0.0,0.0);glVertex2iv(p3);glColor3f(0.0,0.0,1.0);glVertex2iv(p4);glColor3f(0.0,1.0,0.0);glVertex2iv(p5);glColor3f(1.0,0.0,0.0);glVertex2iv(p6);glEnd();glFlush();}void main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(400, 300); glutCreateWindow("轮廓渐变色六边形");init();glutDisplayFunc(polygon);glutMainLoop(); }。

OpenGL图形编程1介绍(陈永强)

OpenGL图形编程1介绍(陈永强)

18
1.1OpenGL的主要功能
位图和图像处理
OpenGL 还提供了专门对位图和图象进行操作的 函数。
19
1.1OpenGL的主要功能
纹理映射
三维景物因缺少景物的具体细节而显得不够真实,为了更 加逼真地表现三维景物,OpenGL 提供了纹理映射的 功能。OpenGL 提供的一系列纹理映射函数使得开发 者可以十分方便地把真实图象贴到景物的多边形上,
32位整数 32位浮点数 64位浮点数
short
long float double
S
L F D
GLubyte,GLboolean
GLshort GLuint,GLenum,GLbitfield
位图字体以及把文本放在窗口的某一位置等这些函数把
Windows 和 OpenGL 揉合在一起。
34
1.4OpenGL基本语法
组成
Win32 API 函数库
这部分函数没有专用的前缀,主要用于处理像素 存储格式和双帧缓存。
35
1.4OpenGL基本语法
函数命名规则
OpenGL函数都遵循一个命名约定,即采用以下格
从而可以在视窗内绘制逼真的三维景观。
20
1.1OpenGL的主要功能
实时动画
为了获得平滑的动画效果,需要先在内存中生成 下一幅图象,然后把已经生成的图象从内存拷 贝到屏幕上,这就是 OpenGL 的双缓存技术 (double buffer)。OpenGL 提供了双缓存 技术的一系列函数。
21
1.1OpenGL的主要功能
交互技术
目前有许多图形应用需要人机交互,OpenGL 提
供了方便的三维图形人机交互接口,用户可以选

12_2012三维图形学_OpenGL编程(2)

12_2012三维图形学_OpenGL编程(2)
6.让定义在OpenGL中的图形进行几何变换
(1)OpenGL进行几何变换的基本方法。 在OpenGL中,一般使用矩阵左乘的方法描述图形进行 几何变换,矩阵右乘表达式与矩阵左乘表达式如下:
P1点经过矩阵T1、T2变换之后变成了P2点,
用矩阵右乘可以表示为 用矩阵左乘可以表示为
P2=P1T1T2; P2T=T2TT1TP1T ;
即矩阵左乘描述方法与矩阵右乘描述方法可以相互转
换,只需把各矩阵进行转置变换处理即可;
对于矩阵左乘描述方法,OpenGL的函数只需把T2T、T1T、 P1T依次推入OpenGL的矩阵乘法器中进行运算处理,最后 可求出P2T。这样处理,硬件设计简单。
2020/12/12
OpenGL编程2
1
(2)OpenGL提供下述函数供用户定义几何变换功能 函数
函数 void glTranslatef ( GLfloat x , GLfloat y , GLfloat z ); 表示图形分别沿x,y,z方向进行平移变换。
OpenGL还提供了直接定义变换矩阵与其矩阵元素等函 数,略。
2020/12/12
OpenGL编程2
2
(3)OpenGL提供矩阵堆栈功能,供用户使用 OpenGL为了便于用户编程操作矩阵运算,特提供了对 矩阵进行堆栈操作的功能,即 进栈矩阵函数 glPushMatrix() 出栈矩阵函数 glPopMatrix() 利用这两项操作,用户可以随时进栈保存矩阵乘法器当 前的矩阵参数,并在需要时恢复该矩阵的数据。 这样用户就能在OpenGL的编程过程中,对不同的图形 分别做不同的几何变换。 灯光在OpenGL中是一个没有几何形状、但有几何位置、 能发射光线的物体(需要灯光物体几何形状时另建几何模 型模拟),故灯光的几何位置,也能进行几何变换 看sample2.cpp程序清单 该程序在sample1.cpp的基础上扩展而来。

OpenGL图形编程3二维观察与三维变换(陈永强)讲课讲稿

OpenGL图形编程3二维观察与三维变换(陈永强)讲课讲稿
18
3.2.2模型视图矩阵
平移 旋转 比例
19
3.2.2模型视图矩阵
平移
void glTranslate{fd}(TYPE x,TYPE y,TYPE z);
参数x,y,z就是目标分别沿三个轴的正向平移的 偏移量。这个函数用这三个偏移量生成的矩阵 完成乘法。
当参数是(0.0,0.0,0.0)时,生成的矩阵是单位 矩阵,此时对物体没有影响。
,这样就有效地排除了视见空间之外的所有数据。 4. 由修剪坐标除以w坐标,得到规格化的设备坐标。注意,在变换
过程中,模型视图矩阵和投影视图矩阵都有可能改变坐标的 w 值。 5. 坐标三元组被视见区变换影射到一个2D平面。这也是一个矩阵 变换,但在OpenGL中不能直接指定或修改它,系统会根据指 定给 glViewport 的值在内部设置它。
这段代码绘制了两个球,第一个绘制的球的球心沿x轴正向移动了10个单 位,而第二球不仅沿y轴正向移动10个单位,也沿x轴正向移动10个 单位。这就是效果积累。
27
3.2.3矩阵操作
单位矩阵
glTranslatef(10.0f, 0.0f, 0.0f); glutSolidSphere(1.0f, 15, 15);
glLoadIdentity();
3
3.1.2指定裁剪窗口
定义二维裁剪窗口
gluOtho2D(xwmin, xwmax, ywmin, ywmax);
其 中 , 双 精 度 浮 点 数 xwmin, xwmax, ywmin, ywmax分别对应裁剪窗口的左、右、下、上四条边 界。
默 认 的 裁 剪 窗 口 , 四 条 边 界 分 别 为 wxl=-1.0, wxr=1.0,wyt=-1.0,wyb=1.0。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OpenGL图形编程
武汉纺织大学数学与计算机学院 授课教师:陈永强 教授
1
2. OpenGL基本图形绘制
2.1glBegin/glEnd
2.2点的绘制
2.3直线的绘制
2.4多边形面的绘制
2.5OpenGL中的字符函数
2.6OpenGL中的反走样
2
2.1glBegin/glEnd
glVertex3f(10.0f,10.0f,0.0f); glVertex3f(20.0f,5.0f,0.0f);
glEnd();
在xy平面内绘制了两条直线(0,0,0)到(10,0,0)和(0,10,0)到(20,5,0)。
13
2.3直线的绘制
直线的绘制
GL_LINE_LOOP模式与GL_LINE_STRIP模式类似,只是会在指定
GL_TRIANGLES
2.1glBegin/glEnd
表 glBegin可支持的OpenGL图元(续)
模式
GL_TRIANGLE_ STRIP
图元类型
将指定的顶点用于创建三角条。指定前三个顶点之后,后继的每 个顶点与它前面两个顶点一起用来构造下一个三角形。每个顶点 三元组(在初的组之后)会自动重新排列以确保三角形绕法的 一致性。 将指定的顶点用于构造三角扇形。第一个顶点充当原点,第三个 顶点之后的每个顶点与它的前一个顶点还有原点一起组合。 每四个顶点一组用于构造一个四边形。如果顶点个数不是四的倍 数,多余的顶点将被忽略 将指定的顶点用于构造四条形边。在第一对顶点之后,每对顶点 定义一个四边形。和 GL_QUADS 的顶点顺序不一样,每对顶 点以指定顺序的逆序使用,以便保证绕法的一致 将指定的顶点用于构造一个凸多边形。多边形的边缘决不能相交 。 最后一个顶点会自动连接到第一个顶点以确保多边形是封闭 的
Shading)。
GL_TRIANGLE_STRIP模式
2.4多边形面的绘制
三角形面的绘制
使用GL_TRIANGLE_FAN模式可以绘制一组相连的三角形,这些 三角形绕着一个中心点成扇形排列。第一个顶点构成扇形的中心
,用前三个顶点绘制出最初的三角形之后, 随后的所有顶点都和
扇形中心以及紧跟在它前面的顶点构成下一个三角形,此时是以 顺时针方向穿过顶点。
在指定顶点的列表时,通过设置和清除边缘标记,可以通知 OpenGL哪些线段被认为是边线(围绕图形边界的线),哪些
线段不是(不应该显示的内部线段)。
glEdgeFlag函数用一个参数把边缘标记设为 True或false。当函 数被设置为True 时,后面的顶点将标记出边界线段的起点。 glEdgeFlag(True) glEdgeFlag(False)
21
2.4多边形面的绘制
三角形面的绘制
在OpenGL中,面是由多边形构成的。 三角形是最简单的多边形,有三条边。可以使用 GL_TRIANGLES模式通过把三个顶点连接到一起而 绘出三角形。
2.4多边形面的绘制
三角形面的绘制 以下绘制了一个三角形:
glBegin(GL_TRIANGLES);
P4 (a)GL_LINES画线模式
P1
P4 (b)GL_LINE_LOOP画线模式 图5-57 OpenGL画线模式
P1
P4 (c)GL_LINE_STRIP画线模式
P1
10
2.3直线的绘制
直线的绘制
使用模式GL_LINES可以在两点之间画线,在两点(0,0,0)和 (10,10,10)之间画一条直线:
glBegin(GL_LINES);
glVertex3f(0.0f,0.0f,0.0f); glVertex3f(10.0f,10.0f,10.0f); glEnd(); 注意,在glBegin/glEnd序列中两个顶点指定了一个直线,如果序 列中指定的点为奇数个,那么最后一个顶点将被忽略。
11
2.3直线的绘制
数组 sizes中保存了glLineWidth的最小有效值和最大有效值,而变量step将 保存线宽之间允许的最小增量。OpenGL规范只要求支持一种线宽:1.0。 Microsoft的OpenGL实现允许线宽从0.5到10.0,最小增量为 0.125。
17
2.3直线的绘制
直线的属性 线型
可以用虚线或短划线模式创建直线,需要先调用:
18
2.3直线的绘制
模式:0X00FF = 255 二进制表示 :0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
画线模式: 线:
图5-58 画线模式用于构造线段
19
2.3直线的绘制
例子 红皮书lines.c
2.4多边形面的绘制
三角形面的绘制 GL_TRIANGLES GL_TRIANGLE_STRIP GL_TRIANGLE_FAN 四边形面的绘制 GL_QUADS GL_QUADS_STRIP 多边形面的绘制(GL_POLYGON)
的最后一个顶点与第一个顶点之间画最后一条线。
14
2.3直线的绘制
直线的属性 线宽 线型
15
2.3直线的绘制
直线的属性 线宽
可用glLineWidth指定线宽:
void glLineWidth(GLfloat width)
与点的大小类似,glLineWidth函数采用一个参数 来指定要画的线以象素计的近似宽度 。
OpenGL的图元绘制放在函数glBegin和
glEnd之间,由函数glBegin的参数指定绘制
图元的类型。
2.1glBegin/glEnd
表 glBegin可支持的OpenGL图元
模式
GL_POINTS GL_LINES GL_LINE_STRIP GL_LINE_LOOP
图元类型
将指定的各个顶点用于创建单个的点 将指定的顶点用于创建线段。每两个顶点指定一条单独的线 段。如果顶点个数是奇数,则忽略后一个 将指定的顶点用于创建线条。第一个顶点之后的每个顶点指 定的是线条延伸到的下一个点 特性和GL_LINE_STRIP 相似,只不过最后一条线段是 在指定的后一个和第一个顶点之间绘制。典型情况下,这用 于绘制那些可能违反了 GL_POLYGON 用法规则的封闭 区域 将指定的顶点用于构造三角形。每三个顶点指定一个新三角 形。如果顶点个数不是三的倍数,多余的顶点将被忽略
glEnable(GL_LINE_STIPPLE);
然后,建立用于画线的模式 :
glLineStipple(GLint factor,GLushort pattern); 参数pattern是一个 16 位值,指定画线时所用的模式,逆向使 用。每一位代表线段的一部分是开还是关。默认情况下,每一 位对应一个象素。 参数factor充当倍数可以增加模式的宽度。
GL_TRIANGLE_FAN模式
2.4多边形面的绘制
多边形面的绘制规则 所有多边形都必须是平面的。
多边形的所有顶点必须位于一个平面上,不能在空间中 扭曲。
多边形的边缘决不能相交,而且多边形必须 是凸的。
如果有任意两条边交叉,就称这个多边形与自己相交。 “凸的”是指任意经过多边形的直线进入和离开多边形 的 次数不超过一次。
点的坐标(x,y,z,w)实际上构成了一个齐次坐标。在OpenGL中
,仍然使用规范化齐次坐标以保证点的齐次坐标与三维坐标的一一对应 关系,最后指定的空间点的坐标为(x/w,y/w,z/w,1),w成了 坐标值的一个缩放因子。
6
2.2点的绘制
点的绘制 glBegin(GL_POINTS); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(10.0f, 0.0f, 0.0f); glEnd();
glVertex2f(0.0,0.0);
glVertex2f(15.0,15.0); glVertex2f(30.0,0.0); glEnd();
注意:这里三角形将被用当前选定的颜色填充,如果尚未 指定绘图的颜色,结果将是不确定的。
2.4多边形面的绘制
三角形面的绘制
使用GL_TRIANGLE_STRIP模式可以绘制几个相连的 三角形,系统根据前三个顶点绘制第一个多边形,以 后每指定一个顶点,就与构成上一个三角形的后两个 顶点绘制新的一个三角形。
GL_TRIANGLE_ FAN GL_QUADS GL_QUADS_ST RIP GL_POLYGON
2.2点的绘制
点的绘制
glVertex函数用于指定顶点,可以有2,3,4个参数。 带2个参数时指定的是空间点的x,y坐标,其z坐标为默认值0,在绘制平面
图形时常常使用这类函数;
带3个参数时指定的是空间点的x,y还有一个不为0的w坐标。
7
2.2点的绘制
点的属性(大小)
在OpenGL中绘制一个点时,点大小的默认值是一个象素 。可以用函数glPointSize修改这个值:
void glPointSize(GLfloat size);
这个函数采用一个参数来指定画点时以象素为单位的近似
直径。
8
2.2点的绘制
点的属性(大小)
通常使用下面的代码来获取点大小的范围和它们之间最小的中间值: GLfloat sizes[2]; //保存绘制点的尺寸范围
30
2.4多边形面的绘制
多边形面的属性
颜色
在绘制多边形时,常常要指定绘制的颜色。在OpenGL中,颜色实际
上是对各个顶点而不是对各个多边形指定的。
多边形的轮廓或者内部用单一的颜色或许多不同的颜色来填充的处理 方式称为明暗处理。
在OpenGL中,用单一颜色处理的称为平面明暗处理(Flat
Shading),用许多不同颜色处理的称为光滑明暗处理( Smooth Shading),也称为Gourand明暗处理(Gourand
相关文档
最新文档