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。

OpenGL程序结构与基本图形的绘制

OpenGL程序结构与基本图形的绘制

实验名称OpenGL程序结构与基本图形的绘制一、实验目的学习基于OpenGL的图形学编程,掌握程序设计的基本过程与程序的基本结构。

二、实验内容在VC6.0下生成基于控制台的应用程序,把OpenGL的基本头文件包含进应用程序中,并设置好相应的环境参数,编写基于OpenGL的应用程序,实现基本图形的绘制。

三、实验步骤1.在VC6.0环境下生成一基于控制台的应用程序(win32 console),选择存储目录为桌面,名字为学号或者姓名的拼音。

如下图:2.在创建的应用程序中选择创建一个“hello world”的应用程序。

3.把以下代码加入到应用程序的CPP文件中。

void display() {glClear( GL_COLOR_BUFFER_BIT); // Clear the frame buffer glColor3f( 0.0, 1.0, 0.0); // Set current color to green}void init() {glClearColor( 0.0, 0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}并把原main函数中的内容用以下代码替换:glutInit( &argc, argv);glutInitWindowSize( 400, 400);glutInitWindowPosition( 200, 100);glutCreateWindow( "Green Triangle");glutDisplayFunc( display);init();glutMainLoop();return 0;4.修改display函数,实现三角形,多边形及圆等基本图形的绘制。

OpenGL图形编程2基本图形绘制(陈永强)只是分享

OpenGL图形编程2基本图形绘制(陈永强)只是分享
void glPointSize(GLfloat size);
这个函数采用一个参数来指定画点时以象素为单位的近似 直径。
7
2.2点的绘制
点的属性(大小)
通常使用下面的代码来获取点大小的范围和它们之间最小的中间值:
GLfloat sizes[2]; //保存绘制点的尺寸范围
GLfloat step;
将指定的各个顶点用于创建单个的点
GL_LINES GL_LINE_STRIP GL_LINE_LOOP
GL_TRIANGLES
将指定的顶点用于创建线段。每两个顶点指定一条单独的线 段。如果顶点个数是奇数,则忽略后一个
将指定的顶点用于创建线条。第一个顶点之后的每个顶点指 定的是线条延伸到的下一个点
特性和GL_LINE_STRIP 相似,只不过最后一条线段是在 指定的后一个和第一个顶点之间绘制。典型情况下,这用于 绘制那些可能违反了 GL_POLYGON 用法规则的封闭区域
glBegin(GL_LINE_STRIP); glVertex3f(0.0f,0.0f,0.0f); 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)。
OpenGL图形编程2基本图形绘 制(陈永强)
2.1glBegin/glEnd
OpenGL的图元绘制放在函数glBegin和 glEnd之间,由函数glBegin的参数指定绘制 图元的类型。
2.1glBegin/glEnd
模式
GL_POINTS
表 glBegin可支持的OpenGL图元

OpenGL基本几何图形的绘制

OpenGL基本几何图形的绘制
参数{234}:为输入的坐标值个数; 参数{sifd}:为输入坐标的数据类型; 参数(cords)是四维坐标(x,y,z,w)的缩写,最少必须用二维 坐标(x,y)。默认值z为0.0,w为1.0。
2020/7/1
2
3终都是通过一组有序顶点来描述的。 OpenGL中有十种基本图元,从空间中绘制的简单的 点到任意边数的封闭多边形。用glBegin命令可告诉 OpenGL开始把一组顶点解释为特定图元。然后用 glEnd命令结束该图元的顶点列表。
glEnd();
100 150 200
2020/7/1
8
3.4.2 线的绘制(续)
连接线段的绘制:
glColor3f(1.0,0.0,0.0);
glLineWidth(5.0);
200
glBegin(GL_LINE_STRIP);
150
glVertex3f(0.0,0.0,0.0);
100
glVertex3f(50.0,50.0,0.0);
glVertex3f(-10.0,5.0,0.0);
glVertex3f(-10.0, 0.0,0.0);
glEnd();
2020/7/1
12
3.4.3 多边形的绘制(续)
四边形的绘制:
✓OpenGL中的GL_QUADS图元用来绘制一个四边形。 与三角形一样,GL_QUADS_STRIP图元指定一条相互连 接的四边形。 ✓由于矩形在图形应用中非常普遍,它不必通过glBegin 和glEnd之间的顶点来进行绘制,而是通过使用如下的函 数:
10
3.4.3 多边形的绘制
三角形的绘制:
glColor3f(1.0,0.0,0.0);
glBegin(GL_TRIANGLES); glVertex3f(0.0,0.0,0.0); glVertex3f(5.0,5.0,0.0); glVertex3f(10.0, 0.0,0.0);

实验OpenGL基本图形绘制

实验OpenGL基本图形绘制

实验一OpenGL基本图形绘制一、实验目的和要求:1. 了解VC++环境下,OpenGL图形绘制的程序结构;2. 通过编程实现简单二维图形的绘制;3. 掌握理解简单的OpenGL程序结构;掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数4. 掌握图形显示原理。

二、实验内容:1、OpenGL在VC++下的安装和配置2、读懂给定的示例程序,使用Visual C++ 6.0和OpenGL编写几个简单图形的绘制程序。

3、建议有能力的学生进一步学习OpenGL的复杂功能创建效果更好的三维图形;三、实验步骤:1、初步了解OpenGL的功能以及语法特点;2、下载glut包,复制 glut32.dll到winnt/system32文件夹下,复制glut32.lib到vc98/lib文件夹下,复制glut.h到vc98/include/gl文件夹下;3、创建VC工程:选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。

VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里;4、为项目添加文件:为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glut32.lib、opengl32.lib,这三个文件位于VC安装目录下的lib目录(如c:\program files\ devstudio\vc\lib)中。

选中菜单Project->Add ToProject->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。

这三个文件请务必加入,否则编译时会出错。

或者将这三个文件名添加到Project->Setting->Link-> Object /library Modules 即可。

OpenGL图形编程2基本图形绘制(陈永强)只是分享

OpenGL图形编程2基本图形绘制(陈永强)只是分享
GL_SMOOTH,分别表示平面明暗处理和光滑 明暗处理。
31
2.4多边形面的绘制
多边形面的属性 颜色
glShadeModel(GL_FLAT) 指定多边形最后一个顶点 时的当前颜色作为填充多边形的纯色,唯一例外 是GL_POLYGON图元,它采用的是第一个顶点的 颜色。
glGetFloatv(GL_LINE_WIDTH_GRANULARITY,&step);
数组 sizes中保存了glLineWidth的最小有效值和最大有效值,而变量step将 保存线宽之间允许的最小增量。OpenGL规范只要求支持一种线宽:1.0。
Microsoft的OpenGL实现允许线宽从0.5到10.0,最小增量为 0.125。
点的坐标(x,y,z,w)实际上构成了一个齐次坐标。在OpenGL中 ,仍然使用规范化齐次坐标以保证点的齐次坐标与三维坐标的一一对应关 系,最后指定的空间点的坐标为(x/w,y/w,z/w,1),w成了坐
标值的一个缩放因子。
5
2.2点的绘制
点的绘制 glBegin(GL_POINTS); glVertex3f(0.0f, 0.0f, 0.0f); glVertex3f(10.0f, 0.0f, 0.0f); glEnd();
与点的大小类似,glLineWidth函数采用一个参数 来指定要画的线以象素计的近似宽度 。
15
2.3直线的绘制
直线的属性
线宽
可以用下面的代码来获取线宽范围和它们之间的最小间隔:
GLfloat sizes[2]; //保存线宽的尺寸范围
GLfloat step;
//保存线宽尺寸的最小间隔
Байду номын сангаас
glGetFloarv(GL_LINE_WIDTH_RANGE,sizes);

2013结合OpenGL的图形编程教学模式研究_陈永强

2013结合OpenGL的图形编程教学模式研究_陈永强
相比较 而 言,控 制 台 应 用 程 序 +OpenGL 模 式 较 简 单。教师教学 准 备 方 便 ,学 生 在 掌 握 基 本 C 语 言 编 程 知 识和 OpenGL 实用程序工具包 GLUT 的 窗 口 管 理 方 法 基 础上,可集中精力学习 OpenGL 的图形绘制技术 。学 生 学 习理解容易、上手快,数 学 效 果 明 显。 但 这 个 模 式 与 实 际 的主流图形软件开 发 方 式 有 一 定 距 离 ,实 用 性 差,适 用 范 围窄。
调 函 数 里,通 过 glutDisplayFunc函 数 作 为 注 册 函 数 将 显 示回调函数注册指定为当前窗口的显示内容函数。类似 地,可以用 GLUT 提 供 的 其 它 注 册 函 数 注 册 相 应 事 件 的 回调函数,处理用户输入或系统状态改变等事件 。
最后用 gluMainLoop函数启 动 主 GLUT 事 件 处 理 循 环,运行程序显示绘制窗口 。
关 键 词 :图形编程;计算机图形学;教学模式;OpenGL 中 图 分 类 号 :TP434 文 献 标 识 码 :A 文 章 编 号 :1672-7800(2013)006-0148-02
1 国 内 教 学 现 状
为有助于学生学习和理解计算机图形学的基本概念、 原理与算法,需要结合形象化的图形编程实例和实验 来 补 充说明和练习。国内教材和教学中计算机图形学案例和 实验图形编程 选 用 的 编 程 语 言 有 C、C+ + 和 Java。Java 主要面向嵌入式设备和网络 使 用 ,目 前 PC 机 上 软 件 编 程 教学通常采用 C 和 C++编程语言,选择的图形开发 环 境 是在 VC++里使 用 控 制 台 应 用 程 序、MFC 可 执 行 程 序、 OpenGL 开放图形库、Direct3D 图形库等几种方式 。

OpenGL图形编程4网格化曲线曲面与实体造型陈永强ppt课件

OpenGL图形编程4网格化曲线曲面与实体造型陈永强ppt课件
单位是象素还是物体空间坐标长度。
29
4.2.2B样条曲线曲面
3.设置NURBS对象属性 Property属性名称与参数value取值如下 属性名称为GLU_U_STEP和GLU_V_STEP ,参数
value指定在u或v方向上每单位长度内有多少采样点 ,其默认值为100。注意的是,采样方式应该置为 GLU_DOMAIN_DISTANCE。
Bezier曲线的生成步骤
第4步还可以用以下函数来生成一组均匀分布的参数值,显示曲线 //指定曲线参数t从t1开始经过n步均匀地变为t2。 glMapGrid1{fd}(GLint n,TYPE t1,TYPE t2); //指定从第n1个到第n2个参数(由glMapGrid1算出)绘制 glEvalMesh1(GLenum mode,GLint n1,GLint n2);
28
4.2.2B样条曲线曲面
3.设置NURBS对象属性
Property属性名称与参数value取值如下 属性名称为GLU_SAMPLING_TOLERENCE,参数value指定经
网格化处理得到的多边形的最大边长; 属性名称为GLU_PARAMETRIC_TOLERENCE,参数value指定
经网格化处理得到的多边形与原来曲线之间的最大距离; 以上两个属性将根据属性GLU_SAMPLING_METHOD确定边长的
GLUnurbsObj* gluNewNurbsRenderer(void);
创建一个指向该对象的指针,以便在创建时使用 。
21
4.2.2B样条曲线曲面
2.指定NURBS对象 具体程序:
GLUnurbsObj *curveName; curveName=gluNewNurbsRenderer(); 如果系统没有足够的存储容量来存储NURBS对象, gluNewNurbsRenderer函数会返回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
相关文档
最新文档