MFC设定OPENGL的当前渲染线程,且不利用GLFW创建窗口实现GLAD的初始化

写一个函数方法在MFC中对OPENGL进行初始化,,在GLAD初始化之前不进行GLFW创建,而是基于当前客户区DC

#include<glad.h>
BOOL CSTLView::InitializeOpenGL()
{

	m_pDC = new CClientDC(this);

	if (m_pDC == NULL)
	{
		MessageBox(_T("Error Obtaining DC"));
		return FALSE;
	}

	if (!SetupPixelFormat())
	{
		return FALSE;
	}\
	
	CreateModernOpenGLContext();
	
	if (!gladLoadGL())
	{
		MessageBox(_T("Failed to initialize GLAD"));
		return FALSE;
	}

	::glClearColor(0.95f, 0.95f, 0.95f, 0.95f);    
	glClear(GL_COLOR_BUFFER_BIT);

	::glClearDepth(1.0f);
	::glEnable(GL_DEPTH_TEST);
	
	return TRUE;
}

其中SetupPixelFormat是像素格式:

BOOL CSTLView::SetupPixelFormat()
{
	static PIXELFORMATDESCRIPTOR pfd =
	{
		sizeof(PIXELFORMATDESCRIPTOR),  // pfd的尺寸
		1,                              // 版本号
		PFD_DRAW_TO_WINDOW |            // 支持窗口
		PFD_SUPPORT_OPENGL |            // 支持OpenGL
		PFD_DOUBLEBUFFER,                // 双缓冲
		PFD_TYPE_RGBA,                  // RGBA类型
		32,                             // 24位颜色深度   
		0, 0, 0, 0, 0, 0,               // 颜色位被忽略
		0,                              // 无缓冲
		0,                              // 移位位被忽略
		0,                              // 无累加缓冲
		0, 0, 0, 0,                     // accum 位被忽略
		16,                             // 16位z缓冲
		24,                              // 无模具缓冲
		0,                              // 无辅助缓冲区
		PFD_MAIN_PLANE,                 // 主层
		0,                              // 保留
		0, 0, 0                         // 图层蒙版
	};
	int m_nPixelFormat = ::ChoosePixelFormat(m_pDC->GetSafeHdc(), &pfd);
	if (m_nPixelFormat == 0)
	{
		return FALSE;
	}
	if (::SetPixelFormat(m_pDC->GetSafeHdc(), m_nPixelFormat, &pfd) == FALSE)
	{
		return FALSE;
	}
	return TRUE;
}

CreateModernOpenGLContext基于WGL扩展:

#include <wglext.h>
BOOL CSTLView::CreateModernOpenGLContext()
{
	int attribs[] =
	{
		WGL_CONTEXT_MAJOR_VERSION_ARB, 3, 
		WGL_CONTEXT_MINOR_VERSION_ARB, 3,
		WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB,
		0
	};

	HGLRC hTempContext = wglCreateContext(m_pDC->GetSafeHdc());
	wglMakeCurrent(m_pDC->GetSafeHdc(), hTempContext);  

	PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB = NULL;
	wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)wglGetProcAddress("wglCreateContextAttribsARB");
	if (wglCreateContextAttribsARB)
	{
		m_hRC = wglCreateContextAttribsARB(m_pDC->GetSafeHdc(), 0, attribs);
		wglMakeCurrent(NULL, NULL);
		wglDeleteContext(hTempContext);
	}

	if (!m_hRC) return FALSE;

	return wglMakeCurrent(m_pDC->GetSafeHdc(), m_hRC);
}

具体根据你的使用,再做修改。

创建一个简单的 "HelloOpenGL" 窗口来验证 GLFWGLAD 的加载通常涉及以下几个步骤: 1. 首先,确保你已经安装了 GLFWGLAD,并包含了它们的头文件。通常情况下,你需要从 GitHub 上下载相应的库并链接到你的项目。 2. 初始化 GLFW使用 GLFW 函数 `glfwInit()` 启动图形上下文,然后创建一个窗口,设置标题等基本属性。 ```c #include <GLFW/glfw3.h> // ... if (!glfwInit()) { // GLFW 初始化失败,处理错误 return -1; } // 创建一个窗口 GLFWwindow* window = glfwCreateWindow(800, 600, "Hello OpenGL", nullptr, nullptr); ``` 3. 加载 GLADGLAD 提供了一个函数 `gladLoadGLLoader`,它需要一个加载器函数作为参数。你可以选择 GLFW 的 `glfwGetProcAddress` 函数作为加载器。 ```c #include <GLAD/glad.h> // ... // 调用 gladLoadGLLoader 并传入 GLFW 的获取器函数 if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { // GLAD 初始化失败,处理错误 glfwTerminate(); return -1; } ``` 4. 检查版本和特性:检查 GL 版本和必要的功能是否存在,以便后续代码能正常工作。 ```c int majorVersion, minorVersion; if (glGetIntegerv(GL_MAJOR_VERSION, &majorVersion) || glGetIntegerv(GL_MINOR_VERSION, &minorVersion)) { // 版本信息获取失败 return -1; } if (majorVersion < 3 || (majorVersion == 3 && minorVersion < 3)) { // 如果不是现代 GL,处理错误 return -1; } ``` 5. 渲染循环:进入一个主渲染循环,在循环中检查事件、清除颜色缓冲区、绘制基本几何形状(例如一个三角形),以及交换双缓冲。 ```c while (!glfwWindowShouldClose(window)) { // ... // 渲染代码 // ... glfwSwapBuffers(window); // 交换缓冲 glfwPollEvents(); // 处理输入和窗口大小变化 } ``` 6. 最后,记得在退出时清理资源,如关闭窗口和销毁 GLFW 实例。 ```c glfwTerminate(); ``` 通过这个简单示例,如果窗口创建成功并且没有遇到任何错误,那么恭喜你,说明 GLFWGLAD 都已成功集成到你的项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值