计算机图形学编程试8MFC明暗处理实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档