计算机图形学编程试8MFC明暗处理实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学编程试8MFC明暗处理实现
————————————————————————————————作者:————————————————————————————————日期:
计算机图形学编程练习8:MFC+明暗处理实现
MFC与OpenGL集成
在Windows下编程,利用MFC是一个非常便捷的方法。本次练习的主要目的,是希望同学们在MFC应用程序框架下进行OpenGL编程。为此,需要对MFC生成的应用程序进行适当的初始化,关于这方面的内容详见:
[1] Crain, Dennis. "Windows NT OpenGL: Getting Started." April 1994. (MSDN Library, Technical Articles)
[2] Rogerson, Dale. "OpenGL I: Quick Start.". December 1994. (MSDN Library, Technical Articles)
[3] D. Shreiner and The Khronos OpenGL ARB Working Group. OpenGL Programming Guide: The Official Guide to Learning OpenGL, Versions 3.0 and 3.1, 7th Ed., 2009. (附录D)
从设计目标来说,OpenGL是流水线结构(streamlined)、硬件无关(hardware-independent)、跨平台的3D图形编程API。但是,在实际应用时,OpenGL的具体实现是与操作系统以及图形硬件相关的。为此,操作系统需要提供像素格式(pixel format)与绘制上下文管理函数(rendering context managnment functions)。Windows操作系统提供了通用图形设备接口(generic graphics device interface, GDI)以及设备驱动实现。为了使OpenGL命令得到正确的执行,需要调用WGL函数,具体的步骤如下:
Step 1: 添加成员变量
在CView类(利用AppWizard生成)中添加如下成员变量:
// OpenGL Windows specification
HDC m_hDC; // Device Context
HGLRC m_hGLRC; // Rendering Context
CPalette m_cGLLP; // Logical Palette
Step 2: 设置像素格式
创建CView类的WM_CREATE的消息响应函数,进行像素格式的设置,例如:
int COpenGLRenderView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
int nPixelFormat; // Pixel format index
HWND hWnd = GetSafeHwnd(); // Get the window's handle
m_hDC = ::GetDC(hWnd); // Get the Device context
static PIXELFORMATDESCRIPTOR pfd = {
sizeof(PIXELFORMATDESCRIPTOR), // Size of this structure
1, // Version of this structure
PFD_DRAW_TO_WINDOW | // Draw to Window (not to bitmap)
PFD_SUPPORT_OPENGL | // Support OpenGL calls in window
PFD_DOUBLEBUFFER, // Double buffered mode
PFD_TYPE_RGBA, // RGBA Color mode
24, // Want 24bit color
0,0,0,0,0,0, // Not used to select mode
0,0, // Not used to select mode
0,0,0,0,0, // Not used to select mode
32, // Size of depth buffer
0, // Not used to select mode
0, // Not used to select mode
PFD_MAIN_PLANE, // Draw in main plane
0, // Not used to select mode
0,0,0 }; // Not used to select mode
// Choose a pixel format that best matches that described in pfd
nPixelFormat = ChoosePixelFormat(m_hDC, &pfd);
// Set the pixel format for the device context
VERIFY(SetPixelFormat(m_hDC, nPixelFormat, &pfd));
// Create the rendering context
m_hGLRC = wglCreateContext(m_hDC);
// Create the palette if needed
InitializePalette();
// Make the rendering context current, perform initialization, then deselect it VERIFY(wglMakeCurrent(m_hDC, m_hGLRC));
GLSetupDef(m_hDC);
wglMakeCurrent(NULL, NULL);
return 0;
}
上述步骤的具体含义参看参考文献[1-3].
Step 3: 创建绘制上下文
该步骤在Step 2中已完成,具体的就是:
m_hGLRC = wglCreateContext(m_hDC);
Step 4: 设置调色板
创建CView类的一个成员函数,进行调色板的设置,例如:
void CTriangularPatchView::InitializePalette(void)
{
PIXELFORMATDESCRIPTOR pfd; // Pixel Format Descriptor
LOGPALETTE *pPal; // Pointer to memory for logical palette