概述
为了大作业临时抱下佛脚
OnCreate
创建 OpenGL 的绘图设备。 OpenGL 绘图的机制是: 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的绘图上下文 Device Context (简记为 DC).要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。
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
void COpenGLPlatView::OnDestroy()
{
CView::OnDestroy();
// TODO: 在此处添加消息处理程序代码
wglMakeCurrent(NULL, NULL);
wglDeleteContext(m_hRC); //删除RC
m_hRC = NULL;
}
OnSize
在OnSize()中一般用来设置视口和视锥,因为这些是和窗口大小相关的。基本操作包括设置视口,选择投影矩阵,设置模型视图矩阵。
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
//实验一:绘制茶壶
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()函数理解
//实验二:二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);
}
//实验三:光照与材质
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所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复