做网站需要硬件设施,网站设计基础知识,建设工程有限公司资质,广州天美展览公司网站glmark2代码阅读总结
一、总体
用输入参数生成testbench项用scene和benchmark管理进行复用通过类的重载#xff0c;创建出不同的分支和具体的实现点#xff0c;如scene和mainloop类用例执行又规划#xff0c;每个scene都统一有setup#xff0c;等使用scene的继承关系创建出不同的分支和具体的实现点如scene和mainloop类用例执行又规划每个scene都统一有setup等使用scene的继承关系整体的调用流程就比较简单好组织
二、小技巧
一组字符串添加间隔方法
用一个static的变量控制第一个
std::string Values;
for (iterator It Map.begin();It ! Map.end();It)
{static bool doSeparator(false);if (doSeparator){Values ,;}const std::string curName It-first;Values curName;doSeparator true;
}列出目录下的文件
只限于Linux下用dirent.h头文件的目录操作函数opendir、readdir 和 closedir。
#include fstream
#include dirent.hvoid
Util::list_files(const std::string dirName, std::vectorstd::string fileVec)
{DIR* dir opendir(dirName.c_str());if (!dir){Log::error(Failed to open models directory %s\n, dirName.c_str());return;}struct dirent* entry readdir(dir);while (entry){std::string pathname(dirName /);pathname std::string(entry-d_name);// Skip . and ..if (entry-d_name[0] ! .){fileVec.push_back(pathname);}entry readdir(dir);}closedir(dir);
}
字符串定义时截取
使用了std::string模板的特性在定义字符串时从原赋值字符串中取部分字串初始化。
string des(src, startPos, len);表示des是src从startPos开始len长的字符串 类似的用法还有
std::string s(n, x); // 把s初始化为由连续n个字符x组成的串
string s(s2, pos); // s是string s2从下标pos开始的字符的拷贝计算模型perspective参数的方法
/* Calculate a projection matrix that is a good fit for the model */
vec3 maxVec model.maxVec();
vec3 minVec model.minVec();
vec3 diffVec maxVec - minVec;
centerVec_ maxVec minVec;
centerVec_ / 2.0;
float diameter diffVec.length();
radius_ diameter / 2;
float fovy 2.0 * atanf(radius_ / (2.0 radius_));
fovy / M_PI;
fovy * 180.0;
float aspect(static_castfloat(canvas_.width())/static_castfloat(canvas_.height()));
perspective_.setIdentity();
perspective_ * LibMatrix::Mat4::perspective(fovy, aspect, 2.0, 2.0 diameter);shader管理
shader是用了拼接的方式 提供的shader中添加变量的方法ShaderSource::add_const 函数字符串操作先生成变量的定义字符串然后调用 ShaderSource::add 函数这个函数中可以区分是否加到函数内还是函数外函数内使用 ShaderSource::add_local 函数外使用 ShaderSource::add_global。add_local先找到对应函数名换到 “{” 和 “\n” 之后插入要添加的定义字符串add_global先找到 “precious”所在行和 “\n”在下面一行插入要添加的定义字符串同时会检测 “#if” 和 “#endif” 对。
program管理
过程比较明晰阅读和书写方便 Program::init createprogram对象 Program::addShader 加载并编译shader在这里面都对 shader 的处理也都进行了友好的封装valid发给发判断shader是否有效erroMessage输出error logcompile进行编译ready判断编译结果attach将shader和program绑定。 所有shader对象存放在一个Shader的vector中用push_back可以方便的管理。 program也包装了类似的接口addShader、valid、ready、release startuse program
mesh类型
convert_to_mesh set_attrib_locations 设置attrib_location vbo_update_method interleave build_vbo build_array
顶点数据的存放next_vertex set_attrib set_vertex_format set_attrib_locations