项目整合完成,遇到的问题不少,特此记录。

常规展示下游戏场景图,此为开始场景画面,游戏资源来自网络,有些为手工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场景的浏览,后续可以考虑做一些效果比如雨雪,风,烟雾,爆炸,火焰等等。