2021SC@SDUSC
目录
前面的文章中,我们大致梳理了一遍与图形学渲染相关了一些代码,本节我们就来看看游戏引擎是怎样呈现出我们所看到的这样的窗口的。
1.Driver
Driver类为我们创建了一个OpenGL的环境来显示窗口。
class Driver
{
public:
Driver(const Settings::DriverSettings& p_driverSettings);
~Driver() = default;
bool IsActive() const;
private:
void InitGlew();
static void __stdcall GLDebugMessageCallback(uint32_t source, uint32_t type, uint32_t id, uint32_t severity, int32_t length, const char* message, const void* userParam);
private:
bool m_isActive;
};
1.1构造函数
首先,它的构造函数需要这样一个结构体类型:
struct DriverSettings
{
bool debugMode = false;
};
这里主要实现了对于OpenGL内置功能的封装,首先使用InitGlew函数初始化一个glew窗口,并将激活状态m_isActive赋值为true,然后判断p_driverSettings的debugMode。
若当前模式为debug,则利用glGetIntegerv函数获取当前环境标签flag,并将flag与GL_CONTEXT_FLAG_DEBUG_BIT进行按位取与,若结果一致(即结果为真),则调用接下来的4个函数,其具体作用就不作详述,总之将会搭建一个适用于调试的环境。
OvRendering::Context::Driver::Driver(const Settings::DriverSettings& p_driverSettings)
{
InitGlew();
m_isActive = true;
if (p_driverSettings.debugMode)
{
GLint flags;
glGetIntegerv(GL_CONTEXT_FLAGS, &flags);
if (flags & GL_CONTEXT_FLAG_DEBUG_BIT)
{
glEnable(GL_DEBUG_OUTPUT);
glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);
glDebugMessageCallback(GLDebugMessageCallback, nullptr);
glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, nullptr, GL_TRUE);
}
}
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glCullFace(GL_BACK);
}
最后glBlendFunc设置混合模式为alpha值混合,glCullFace设置面剔除为背面剔除,则将会使半透明的物体依据alpha值进行颜色差值混合,并将不再渲染网格中与法向量相反的面。
1.2InitGlew
InitGlew函数早构造函数中使用过,其中调用了OpenGL内置的glewInit函数初始化窗口,并进行错误检测,若glewInit返回的值不等于GLEW_OK,系统将会发出错误信息。
void OvRendering::Context::Driver::InitGlew()
{
const GLenum error = glewInit();
if (error != GLEW_OK)
{
std::string message = "Error Init GLEW: ";
std::string glewError = reinterpret_cast<const char*>(glewGetErrorString(error));
OVLOG_INFO(message + glewError);
}
}
1.3GLDebugMessageCallback
GLDebugMessageCallback函数同样出现在构造函数中,它作为函数glDebugMessageCallback的第一个参数,是glDebugMessageCallback具体功能的实现,将对具体的错误信息作出反馈。
在最开始,我们会选择性忽略一些警告、错误:
void