【Overload游戏引擎】源码分析之十三:OvRendering函数库(十一)

 2021SC@SDUSC

目录

1.Driver

1.1构造函数

1.2InitGlew

1.3GLDebugMessageCallback

2.Renderer

2.1Draw

2.2FetchGLState

2.3ApplyStateMask


前面的文章中,我们大致梳理了一遍与图形学渲染相关了一些代码,本节我们就来看看游戏引擎是怎样呈现出我们所看到的这样的窗口的。

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 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值