【OpenGL】基本函数汇总

为了大作业临时抱下佛脚

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);


}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值