需求:写glsl shader文件写多了,有一些公共的函数要在不同shader文件重复写一遍,相当烦!因此想include一个公共的shader文件,这个文件存一些公共函数。
实现这个功能有两个思路:要么在编译shader文件时处理宏定义include,同时要有自己一套的文件系统,shader文件里面include哪个文件,就去搜索自己的valid路径下是否存在这个文件,如果存在,读这个文件成字符串,与原来的shader文件拼接成一个字符串,再用gl compiler去编译;要么是用扩展GL_ARB_shading_language_include
,这个扩展的资料相当少(指的是万能的谷歌,而不是废物baidu)。这里用了第二种思路来实现shader文件的include功能。
GL_ARB_shading_language_include
这个是GL的扩展,需要先检查自己的环境是否支持这个扩展,如果不支持,你可以关掉了(对不起)。下面是检查是否支持扩展的代码(截取我项目的代码)
static std::vector<std::string> g_supportExtensions;
void GetSupportExtensions()
{
if (!g_supportExtensions.empty())
return;
GLint n, i;
glGetIntegerv(GL_NUM_EXTENSIONS, &n);
for (i = 0; i < n; i++)
{
std::string extension = (char*)glGetStringi(GL_EXTENSIONS, i);
//C