项目整合完成,遇到的问题不少,特此记录。 演示截图
常规展示下游戏场景图,此为开始场景画面,游戏资源来自网络,有些为手工DIY。
工程结构
所有涉及到的工程,另外还有我下一步要开发的Update工程,以及main函数代码。

此函数为glfw的封装函数
int CRenderEngine::RunMessageLoop()
{
	//初始化,设置OpenGL版本,以及核心模式
	glfwInit();
	glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
	glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
	glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);

#ifdef __APPLE__
	// uncomment this statement to fix compilation on OS X
	glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
#endif

	//创建窗口
	GLFWwindow* pWindow = glfwCreateWindow(m_nWidth, m_nHeight, m_strTitle.c_str(), NULL, NULL);
	if (nullptr == pWindow)
	{
		std::cout << "Failed to create GLFW window" << std::endl;
		glfwTerminate();
		return -1;
	}
	glfwMakeContextCurrent(pWindow);

	//设置消息处理函数
	glfwSetKeyCallback(pWindow, key_callback);
	glfwSetMouseButtonCallback(pWindow, mouse_button_callback);
	glfwSetCursorPosCallback(pWindow, cursor_position_callback);
	glfwSetScrollCallback(pWindow, scroll_callback);
	glfwSetFramebufferSizeCallback(pWindow, framebuffer_size_callback);

	// glad: 载入所有OpenGL函数指针
	// ---------------------------------------
	if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
	{
		std::cout << "Failed to initialize GLAD" << std::endl;
		return -1;
	}

	CSceneManager *pSceneManager = GetRenderEngine()->GetSceneManager();
	pSceneManager->SetActiveScene(pSceneManager->GetActiveScene());

	//多边形绘制模式设定.
	//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

	float fFPS = 0;
	int nTotalFrame = 0;
	clock_t clockPreviorFrameTime;
	clock_t clockCurrentFrameTime;
	clock_t clockBeginFrameTime = clock();

	while (!glfwWindowShouldClose(pWindow))
	{	
		//清屏
		glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT);

		RenderScene(pSceneManager->GetActiveScene());
		//计算FPS
		nTotalFrame++;
		clockCurrentFrameTime = clock();
		float fTotalTime = (clockCurrentFrameTime - clockBeginFrameTime) / 1000;
		fFPS = nTotalFrame / fTotalTime;

		glfwSwapBuffers(pWindow);
		glfwPollEvents();
	}

	glfwTerminate();
	return 0;
}

相关问题

由于原来的D2D只涉及画位图,而整合OpenGL则不一样,涉及到很多绘制资源的管理Texture,VAO,VBO,ShaderProgram等等,所以原来想的涉及RenderEngine的接口然后分别用GDI,OpenGL,DirectX来实现并不现实,接口太难统一。
有些png图片,stbimage打不开,我用Photoshop重新保存了下,就可以打开了,说明stbimage容错性不高。 由于opengl里面的所有图片只能作为纹理显示,开始直接用vao来处理,后来发现要实现类似bitblt的功能就比较麻烦如果从新载入图片copy像素有些浪费,所以就直接用vbo改变了纹理坐标来处理。 关键的是矩阵变换的处理,在container渲染的时候,要旋转,矩阵的处理方式是先将旋转点移动到坐标原点,然后绕着z轴旋转,最后再把坐标移回原位置。 glfw占用内存貌似有点多,启动起来就要用掉29兆内存,而基于D2D的程序总共才需要不到15兆,具体影响未知,效率的话差强人意,后续看看怎么优化吧。 先记录这些吧,在做的时候好像遇到不少问题,事后再想也记不起具体有哪些了。

简单总结

虽然有问题,终归是一个拥有完全源码的工程,至少有改的可能性。另外是一个3D的程序,改改就可以实现3D场景的浏览,后续可以考虑做一些效果比如雨雪,风,烟雾,爆炸,火焰等等。