我是靠谱客的博主 无辜雪碧,这篇文章主要介绍【OpenGL】基本函数汇总OnCreateOnDestroyOnSizeOnDraw,现在分享给大家,希望可以做个参考。

为了大作业临时抱下佛脚

OnCreate

创建 OpenGL 的绘图设备。 OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int COpenGLPlatView::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CView::OnCreate(lpCreateStruct) == -1) return -1; // TODO: 在此添加您专用的创建代码 CClientDC dc(this); //创建DC PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR)); pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 24; pfd.cDepthBits = 32; int pixelFormat = ChoosePixelFormat(dc.m_hDC, &pfd); SetPixelFormat(dc.m_hDC, pixelFormat, &pfd); m_hRC = wglCreateContext(dc.m_hDC); //创建RC return 0; }

OnDestroy

复制代码
1
2
3
4
5
6
7
8
9
10
11
void COpenGLPlatView::OnDestroy() { CView::OnDestroy(); // TODO: 在此处添加消息处理程序代码 wglMakeCurrent(NULL, NULL); wglDeleteContext(m_hRC); //删除RC m_hRC = NULL; }

OnSize

 在OnSize()中一般用来设置视口和视锥,因为这些是和窗口大小相关的。基本操作包括设置视口,选择投影矩阵,设置模型视图矩阵。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void COpenGLPlatView::OnSize(UINT nType, int cx, int cy) { CView::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 CClientDC dc(this); wglMakeCurrent(dc.m_hDC, m_hRC); glMatrixMode(GL_PROJECTION); glLoadIdentity(); double d = 10; double n = 100; glOrtho(-cx / n, cx / n, -cy / n, cy / n, -d, d); glMatrixMode(GL_MODELVIEW); glViewport(0, 0, cx, cy); wglMakeCurrent(NULL, NULL); }

OnDraw

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//实验一:绘制茶壶 void COpenGLPlatView::OnDraw(CDC* pDC) { COpenGLPlatDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 wglMakeCurrent(pDC->m_hDC, m_hRC); //RC 与当前 DC 相关联 glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置清除颜色为白色 glClear(GL_COLOR_BUFFER_BIT); //把窗口清除为当前颜色 glMatrixMode(GL_MODELVIEW); //用来指定哪一个矩阵是当前矩阵,而它的参数代表要 //操作的目标(对模型视景矩阵操作) glLoadIdentity(); //把矩阵设为单位矩阵 glColor3f(1.0f, 0.0f, 0.0f); //设置当前颜色,之后绘制的东西都是当前色 glRotated(60.0, 1.0, 1.0, 1.0); //旋转60度 auxWireTeapot(3.0); SwapBuffers(pDC->m_hDC); //把 RC 中所绘传到当前的 DC 上,从而在屏幕上显示 wglMakeCurrent(NULL, NULL); //释放 RC,以便其它 DC 进行绘图 }

glMatrixMode()函数理解

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//实验二:二ci次曲面绘制 void COpenGLPlatView::OnDraw(CDC* pDC) { COpenGLPlatDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 wglMakeCurrent(pDC->m_hDC, m_hRC); glMatrixMode(GL_MODELVIEW); //二次曲面 glColor3f(1.0f, 0.0f, 0.0f); GLUquadric* qd = gluNewQuadric();//创建二次曲面对象 gluQuadricDrawStyle(qd, GLU_FILL);//设置二次曲面对象绘制模式GLU_LINE;GLU_SILHOUETTE;GLU_POINT glLoadIdentity(); glRotated(-105.0, 1.0, 0.0, 0.0); //做(0,0,0)到(x,y,z)的向量,用右手握住这条向量,大 //拇指指向向量的正方向,四指环绕的方向就是旋转的方向; glTranslated(-6.0, 0.0, -2.0); //沿X/y/z轴正方向平移多少个单位(是有符号数) gluCylinder(qd, 2.0, 1.0, 4.0, 30, 4);//(圆台,下底面半径,上底面半径,圆台高度,绕z轴分割瓣数,绕z轴方向层数) glLoadIdentity(); glTranslated(6.0, 0.0, -2.0); gluDisk(qd, 1.0, 2.0, 30, 4);//(平面圆盘,内圆半径,外圆半径,扇形瓣数,环的个数) gluPartialDisk(qd, 1.0, 2.0, 10, 4, 0, 75);//(拱状图形,内圆半径,外圆半径,扇形瓣数,环的个数,起始角,图形张开的角度) //gluSphere(qd, 2.0, 30, 6);//(球,球的半径,分割的瓣数,分割的层次) //auxSolidTetrahedron(4.0);//实体模型auxWireTeapot(4.0);auxSolidTeapot(4.0); //auxWireSphere(3.0);auxSolidSphere(3.0); //auxWireCube(4.0);auxSolidCube(4.0); //auxWireBox(3.0,4.0,5.0);auxSolidBox(3.0,4.0,5.0); //auxWireTorus(1.0,3.0);//圆环auxSolidCylinder(1.0,3.0); //auxWireCylinder(2.0,4.0);auxSolidCylinder(2.0,4.0); //auxWireIcosahedron(4.0);auxSolidIcosahedron(4.0);//二十面体 //auxWireOctahedron(4.0);auxSolidOctahedron(4.0);//八面体 //auxWireTetrahedron(4.0);auxSolidTetrahedron(4.0);//四面体 //auxWireDodecahedron(4.0);auxSolidDodecahedron(4.0);//十二面体 //auxWireCone(2.0,4.0);auxSolidCone(2.0,4.0);//圆锥体 SwapBuffers(pDC->m_hDC);//双缓冲 wglMakeCurrent(NULL, NULL); }

 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
//实验三:光照与材质 void COpenGLPlatView::OnDraw(CDC* pDC) { COpenGLPlatDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 wglMakeCurrent(pDC->m_hDC, m_hRC); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glClearDepth(1.0); //1.0是最大深度(离摄像机距离) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_COLOR_MATERIAL);//激活GL_COLOR_MATERIAL可以让你在激活光照的情况下用glColor //函数给物体上色。如果没有这行代码,纹理将始终保持原来的颜 //色,glColor3f(r,g,b)就没有用了。 glEnable(GL_LIGHTING); //开启光照,启用灯源 glEnable(GL_LIGHT0); //启用0号灯光源,默认光源颜色为白色 glEnable(GL_AUTO_NORMAL); //使图形能把光反射到各个方向 glEnable(GL_NORMALIZE); //自动单位化法向量。opengl自己的光照计算要求法向量单位化。 glEnable(GL_DEPTH_TEST); //开启深度检测,如果没有,那么后绘制的物体覆盖先绘制的物体 glDepthFunc(GL_LESS); // 通过目标像素与当前像素在z方向上值大小的比较是否满足参数指定的 //条件,来决定在深度(z方向)上是否绘制该目标像素。该函数只有启 //用“深度测试”时才有效.GL_LESS:如果输入的深度值小于参考值,则通 //过 /* 在没有学习光照之前,我们是通过glColor()函数来指定物体颜色的,前面已经说过,这时候我们能看到我们 所设置的物体颜色是因为有全局环境光的原因。当开启光照功能后,如果用上述的设置材料属性的方法进行设 置,则原来设置的颜色与被光照到后物体呈现的颜色毫无关系,即原来的 glColor*()命令失去原有的作用。 但还有一种方法设置材料属性的方法,称为颜色追踪,即用颜色指定代替材料属性指定。使用颜色追踪,可以 告诉OpenGL仅仅通过调用glColor来设置材料属性。为了启用颜色追踪,需要以GL_COLOR_MATERIAL为参数调 用glEnable。接着,glColorMaterial函数根据glColor所设置的值来指定材料参数。 */ //设置模型变换矩阵 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //设置光源参数 GLfloat light_position[]={ 1.0f,1.0f,1.0f,0.0f };//光源位置,xyz分量+0无限远/1指定位置 GLfloat light_ambient[] = { 0.2f,0.2f,0.2f,0.2f };//环境光,红绿蓝三种光线成分+透明度值 GLfloat light_diffuse[] = { 0.5f,0.5f,0.2f,0.2f };//散射光 GLfloat light_specular[] = { 0.5f,0.5f,0.5f,0.2f };//镜面光 glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);//对light0的,环境光,进行设置 glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); //设置材质参数 GLfloat material_ambient[] = { 0.2f,0.2f,0.2f,0.2f };//各种光线照射到该材质上,经过很多 //次反射后最终遗留在环境中的光线强度(颜色) GLfloat material_diffuse[] = { 0.2f,0.8f,0.4f,0.8f };//光线照射到该材质上,经过漫反射后 //形成的光线强度(颜色) GLfloat material_specular[] = { 0.2f,0.8f,0.4f,0.8f }; GLfloat material_emission[] = { 0.2f,0.2f,0.2f,1.0f };//该材质本身就微微的向外发射光线 GLfloat material_shiness[] = { 10.0f };//“镜面指数”,取值范围是0到128。该值越小,表示材 //质越粗糙,点光源发射的光线照射到上面,也可以产 //生较大的亮点。该值越大,表示材质越类似于镜面, //光源照射到上面后,产生较小的亮点。 glMaterialfv(GL_BACK, GL_AMBIENT, material_ambient);//FRONT_AND_BACK glMaterialfv(GL_BACK, GL_DIFFUSE, material_diffuse); glMaterialfv(GL_BACK, GL_SPECULAR, material_specular); glMaterialfv(GL_BACK, GL_EMISSION, material_emission); glMaterialfv(GL_BACK, GL_SHININESS, material_shiness); glColor3f(1.0f, 0.0f, 0.0f);//红色 glRotated(60.0, 1.0, 1.0, 1.0); auxSolidTeapot(2.0); SwapBuffers(pDC->m_hDC); wglMakeCurrent(NULL, NULL); }

 

最后

以上就是无辜雪碧最近收集整理的关于【OpenGL】基本函数汇总OnCreateOnDestroyOnSizeOnDraw的全部内容,更多相关【OpenGL】基本函数汇总OnCreateOnDestroyOnSizeOnDraw内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(136)

评论列表共有 0 条评论

立即
投稿
返回
顶部