⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 纹理处理加键盘操作.txt

📁 在VC下实现简单的3D图形绘制
💻 TXT
📖 第 1 页 / 共 2 页
字号:
	}
	if (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))                             // Windows 找到相应的象素格式了吗?
	{
		KillGLWindow();
		// 重置显示区
		MessageBox(NULL,"Can't Find A Suitable PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
		// 返回 FALSE
	}
	if(!SetPixelFormat(hDC,PixelFormat,&pfd))                                   // 能够设置象素格式么?
	{
		KillGLWindow();
		// 重置显示区
		MessageBox(NULL,"Can't Set The PixelFormat.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
		// 返回 FALSE
	}
	if (!(hRC=wglCreateContext(hDC)))                                           // 能否取得着色描述表?
	{
		KillGLWindow();
		// 重置显示区
		MessageBox(NULL,"Can't Create A GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
		// 返回 FALSE
	}
	if(!wglMakeCurrent(hDC,hRC))                                               // 尝试激活着色描述表
	{
		KillGLWindow();
		// 重置显示区
		MessageBox(NULL,"Can't Activate The GL Rendering Context.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
		// 返回 FALSE
	}
	ShowWindow(hWnd,SW_SHOW);
	// 显示窗口
	SetForegroundWindow(hWnd);
	// 略略提高优先级
	SetFocus(hWnd);
	// 设置键盘的焦点至此窗口
	ReSizeGLScene(width, height);
	// 设置透视 GL 屏幕  
	if (!InitGL())                                                              // 初始化新建的GL窗口
	{
		KillGLWindow();
		// 重置显示区
		MessageBox(NULL,"Initialization Failed.","ERROR",MB_OK|MB_ICONEXCLAMATION);
		return FALSE;
		// 返回 FALSE
	}
	return TRUE;
	// 成功
}
LRESULT CALLBACK WndProc( HWND hWnd, 	// 窗口的句柄
UINT uMsg, 								// 窗口的消息
WPARAM wParam, 							// 附加的消息内容
LPARAM lParam) 							// 附加的消息内容
{
	switch (uMsg) 
	{
		// 检查Windows消息
		case WM_ACTIVATE: 				// 监视窗口激活消息
		{
			if (!HIWORD(wParam)) 		// 检查最小化状态
			{
				active=TRUE;
				// 程序处于激活状态
			}
			else
			{
				active=FALSE;
				// 程序不再激活
			}
			return 0;
			// 返回消息循环
		}
		case WM_SYSCOMMAND:				// 中断系统命令Intercept System Commands
		{
			switch (wParam) 			// 检查系统调用Check System Calls
			{
				case SC_SCREENSAVE: 	// 屏保要运行?
				case SC_MONITORPOWER: 	// 显示器要进入节电模式?
				return 0;
				// 阻止发生
			}
			break;
			// 退出
		}
		case WM_CLOSE:					//收到Close消息?
		{
			PostQuitMessage(0);
			// 发出退出消息
			return 0;
		}
		case WM_KEYDOWN: 				// 有键按下么?
		{
			keys[wParam] = TRUE;
			// 如果是,设为TRUE
			return 0;
			// 返回 
		}
		case WM_KEYUP: 					// 有键放开么?
		{
			keys[wParam] = FALSE;
			// 如果是,设为FALSE
			return 0;
			// 返回 
		}
		case WM_SIZE: // 调整OpenGL窗口大小
		{
			ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));
			// LoWord=Width,HiWord=Height
			return 0;
			// 返回 
		}
	}
	//向 DefWindowProc传递所有未处理的消息?
	return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
int DrawGLScene(GLvoid) // 从这里开始进行所有的绘制
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	// 清除屏幕和深度缓存
	glLoadIdentity();
	// 重置当前的模型观察矩阵
	glTranslatef(0.0f,0.0f,z);
	// 移入/移出屏幕 z 个单位
	glRotatef(xrot,1.0f,0.0f,0.0f);
	// 绕X轴旋转
	glRotatef(yrot,0.0f,1.0f,0.0f);
	// 绕Y轴旋转
	glBindTexture(GL_TEXTURE_2D, texture[filter]);
	// 选择由filter决定的纹理
	glBegin(GL_QUADS);
	// 开始绘制四边形
	// 前侧面
	glNormal3f( 0.0f, 0.0f, 1.0f);
	// 法线指向观察者
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, 1.0f);
	// Point 1 (Front)
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f( 1.0f, -1.0f, 1.0f);
	// Point 2 (Front)
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f( 1.0f, 1.0f, 1.0f);
	// Point 3 (Front)
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(-1.0f, 1.0f, 1.0f);
	// Point 4 (Front)
// 后侧面
	glNormal3f( 0.0f, 0.0f,-1.0f);
	// 法线背向观察者
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, -1.0f);
	// Point 1 (Back)
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(-1.0f, 1.0f, -1.0f);
	// Point 2 (Back)
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f( 1.0f, 1.0f, -1.0f);
	// Point 3 (Back)
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f( 1.0f, -1.0f, -1.0f);
	// Point 4 (Back)
// 顶面
	glNormal3f( 0.0f, 1.0f, 0.0f);
	// 法线向上
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(-1.0f, 1.0f, -1.0f);
	// Point 1 (Top)
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(-1.0f, 1.0f, 1.0f);
	// Point 2 (Top)
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f( 1.0f, 1.0f, 1.0f);
	// Point 3 (Top)
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f( 1.0f, 1.0f, -1.0f);
	// Point 4 (Top)
// 底面
	glNormal3f( 0.0f,-1.0f, 0.0f);
	// 法线朝下
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(-1.0f, -1.0f, -1.0f);
	// Point 1 (Bottom)
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f( 1.0f, -1.0f, -1.0f);
	// Point 2 (Bottom)
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f( 1.0f, -1.0f, 1.0f);
	// Point 3 (Bottom)
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, 1.0f);
	// Point 4 (Bottom)
// 右侧面
	glNormal3f( 1.0f, 0.0f, 0.0f);
	// 法线朝右
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f( 1.0f, -1.0f, -1.0f);
	// Point 1 (Right)
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f( 1.0f, 1.0f, -1.0f);
	// Point 2 (Right)
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f( 1.0f, 1.0f, 1.0f);
	// Point 3 (Right)
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f( 1.0f, -1.0f, 1.0f);
	// Point 4 (Right)
// 左侧面
	glNormal3f(-1.0f, 0.0f, 0.0f);
	// 法线朝左
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, -1.0f);
	// Point 1 (Left)
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(-1.0f, -1.0f, 1.0f);
	// Point 2 (Left)
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(-1.0f, 1.0f, 1.0f);
	// Point 3 (Left)
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(-1.0f, 1.0f, -1.0f);
	// Point 4 (Left)
	glEnd();
	// 四边形绘制结束 
	xrot+=xspeed;
	// xrot 增加 xspeed 单位
	yrot+=yspeed;
	// yrot 增加 yspeed 单位
	return TRUE;

}
int WINAPI WinMain( HINSTANCE hInstance,//实例
HINSTANCE hPrevInstance,				// 前一个实例
LPSTR lpCmdLine, 						// 命令行参数
int nCmdShow) 							// 窗口显示状态 
{
	MSG msg;
	// Windowsx消息结构
	BOOL done=FALSE;
	// 用来退出循环的Bool 变量 
	// 提示用户选择运行模式
	if (MessageBox(NULL,"是否在全屏模式下运行?", "开始全屏?",MB_YESNO|MB_ICONQUESTION)==IDNO)
	{
		fullscreen=FALSE;
		//窗口模式
	}
	// 创建OpenGL窗口
	if (!CreateGLWindow("OpenGL项目",1280,800,32,fullscreen))
	{
		return 0;
		// 失败退出
	}
	while(!done) // 保持循环直到 done=TRUE
	{
		if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))	//有消息在等待吗?
		{
			 
			if (msg.message==WM_QUIT)				//收到退出消息?
			{
				done=TRUE;
				// 是,则done=TRUE
			}
			else									// 不是,处理窗口消息
			{
				TranslateMessage(&msg);
				// 翻译消息
				DispatchMessage(&msg);
				// 发送消息
			}
		}
		else										// 如果没有消息
		{
			// 绘制场景?监视ESC键和来自DrawGLScene()的退出消息
			if ((active && !DrawGLScene()) || keys[VK_ESCAPE])	// 程序激活的么?
			{
				
				done=TRUE;
					// 发出退出信号
			}
			else								// 不是退出的时候,刷新屏幕 
			{
				SwapBuffers(hDC);
				// 交换缓存 (双缓存)
				if (keys['L'] && !lp)
				{
					lp=TRUE;
					// lp 设为 TRUE
					light=!light;
					// 切换光源的 TRUE/FALSE
					if (!light)// 如果没有光源
					{
						glDisable(GL_LIGHTING);
						//禁用光源
					}
					else
					{
						glEnable(GL_LIGHTING);
						//启用光源
					}
				}
				if (!keys['L'])//L键松开了么?
				{
					lp=FALSE;
					// 若是,则将lp设为FALSE
				}
				if (keys['F'] && !fp)// F键按下了么?
				{
					fp=TRUE;
					// fp 设为 TRUE
					filter+=1;
					// filter的值加一
					if (filter>2) // 大于2了么?
					{
						filter=0;
						// 若是重置为0
					}
				}
				if (!keys['F']) //F键放开了么?
				{
					fp=FALSE;
					// 若是fp设为FALSE
				}
				if (keys[VK_PRIOR]) //PageUp按下了?
				{
					z-=0.02f;
					// 若按下,将木箱移向屏幕内部。
				}
				if (keys[VK_NEXT]) // PageDown按下了么?
				{
					z+=0.02f;
					//若按下的话,将木箱移向观察者。
				}
				if (keys[VK_UP]) // Up方向键按下了么?
				{
					xspeed-=0.01f;
					//若是,减少xspeed
				}
				if (keys[VK_DOWN]) //Down方向键按下了么?
				{
					xspeed+=0.01f;
					//若是,增加xspeed
				}
				if (keys[VK_RIGHT]) //Right方向键按下了么?
				{
					yspeed+=0.01f;
					//若是,增加yspeed
				}
				if (keys[VK_LEFT]) //Left方向键按下了么?
				{
					yspeed-=0.01f;
					//若是, 减少yspeed
				}
				if (keys[VK_F1])						//  F1键按下了么?
				{
					keys[VK_F1]=FALSE;
				// 若是,使对应的Key数组中的值为 FALSE
					KillGLWindow();
				// 销毁当前的窗口
					fullscreen=!fullscreen;
				// 切换 全屏 / 窗口 模式
				// 重建 OpenGL 窗口
					if (!CreateGLWindow("OpenGL项目",1280,800,32,fullscreen))
					{
						return 0;
					// 如果窗口未能创建,程序退出
					}
				}
			}
		}
	}
	// 关闭程序
	KillGLWindow();
	// 销毁窗口
	return (msg.wParam);
	// 退出程序 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -