openGL中创建OpenGL Render Context的步骤 .

OpenGL是一种基于客户/服务器和管道(PipeLine)的图形库。即一个应用程序(客户)将各种命令和数据写入管道,这命令和数据将被暂时保存起来,图形库(服务器)直到收到一条专门的指令才会开始处理它们,并将处理结果通过管道传给用户。
所以OpenGL应用程序的基本结构就是:


建立管道
根据需要向管道中写入数据和指令
关闭管道
在Windows95/NT环境中,这个管道就是OpenGL着色环境——(OpenGL Render Context)简称RC。因此建立管道实际上就是获取一个可用的RC。


而在Windows的GDI系统中进行图形显示是通过图形设备上下文——(Device Context)简称DC——进行的。所以获取RC就是:
①先获取一个DC,
②调整这个DC的象素格式(PixelFormat)以便OpenGL库进行绘制,
③用DC去调用wglCreateContext(hDC)建立一个RC,
④调用wglMakeCurrent(hRC,hDC)将刚才建立的RC指定为当前的RC。


当一个RC不再使用时就可以删除它,方法是:
使RC不是“当前RC”:
wglMakeCurrent(hDC,NULL); //不再有当前RC
wglDEleteContent(hRC); //删除之
BOOL OpenGLInit(CClientDC* pDC,HGLRC& hglrc)
{
	int n;								//当前选择的像素格式索引

	static PIXELFORMATDESCRIPTOR pfd=
	{									//像素点格式信息描述结构体
		sizeof(PIXELFORMATDESCRIPTOR),
			1,    
			PFD_DRAW_TO_WINDOW |		//支持Windows与OpenGL二环境绘图
			PFD_SUPPORT_OPENGL |
			PFD_DOUBLEBUFFER,			//使用双缓存交换显示图形
			PFD_TYPE_RGBA,			    // RGBA type 
			24,							// 24-bit color depth 
			0, 0, 0, 0, 0, 0,			// color bits ignored 
			0,							// no alpha buffer 
			0,							// shift bit ignored 
			0,							// no accumulation buffer 
			0, 0, 0, 0,					// accum bits ignored 
			32,							// 32-bit z-buffer     
			0,							// no stencil buffer 
			0,							// no auxiliary buffer 
			PFD_MAIN_PLANE,				// main layer 
			0,							// reserved 
			0, 0, 0						// layer masks ignored 
	};

	int pixelformat;
	if((pixelformat=ChoosePixelFormat(pDC->GetSafeHdc(),&pfd))==0)
	{
		AfxMessageBox("选择像素格式化失败");
		return FALSE;
	}

	if(SetPixelFormat(pDC->GetSafeHdc(),pixelformat,&pfd)==FALSE)
	{
		AfxMessageBox("设置像素格式化失败");
		return FALSE;
	}
	
	n=::GetPixelFormat(pDC->GetSafeHdc());
	::DescribePixelFormat(pDC->GetSafeHdc(),n,sizeof(pfd),&pfd);

	hglrc = wglCreateContext(pDC->GetSafeHdc());	//创建绘制情景对象

	wglMakeCurrent(pDC->GetSafeHdc(),hglrc);		//选择绘制情景对象

	glClearDepth(1.0f);
	glEnable(GL_DEPTH_TEST);
//	glMatrixMode(GL_MODELVIEW);						//设置变换模式为模型变换
//	glLoadIdentity();								//初始化模型变换矩阵
	
	return TRUE;
}

BOOL OpenGLExit(CClientDC* pDC,HGLRC& hglrc)
{
	::wglMakeCurrent(NULL,NULL);		//将当前绘图情景对象置空
	
	if(hglrc)
		::wglDeleteContext(hglrc);		//删除当前绘图情景对象

	if(pDC)
		delete pDC;					//删除创建的windows设备上下文

	return TRUE;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IvanLJF

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值