查看帧数
- 在while循环的末尾添加如下代码
glfwPollEvents(); //立即处理已经到位的事件,如果没有这个就会一直渲染而不触发事件
glfwSwapBuffers(window);
modelPicking();
static int ticks = -1;
ticks++;
static double _lastTime = glfwGetTime();
if (ticks == 60)
{
double deltaTime = glfwGetTime() - _lastTime;
_lastTime = glfwGetTime();
cout << "帧数" <<ticks/ deltaTime << endl;
ticks = 0;
}
用指针来优化帧数内存(用指针来存放相同的部分当做模板就行了)
- 单独拿出来模型,用指针的方式优化内存
//通过指针进行帧数优化使用的model对象
struct modelStruct
{
Model* model;
glm::mat4 modelMatrix;
glm::vec3 worldPosition;
};
modelStruct modelObject;
//生成map和map迭代器
map<string, modelStruct> _models;
map<string, modelStruct>::iterator _modelsIter;
modelObject.model = &ourModel;
//下面是两种插入方式,第二种更为简单
_models["Zhang3"] = modelObject;
modelObject.worldPosition = cubePositions[2];
_models["Li4"] = modelObject;
剔除面(不对不需要的面进行渲染)
- 永远不能看到3个以上的面。所以我们为什么要浪费时间绘制我们不能看见的那3个面呢?如果我们能够以某种方式丢弃这几个看不见的面,我们能省下超过50%的片段着色器执行数!
- OpenGL能够检查所有面向(Front Facing)观察者的面,并渲染它们,而丢弃那些背向(Back Facing)的面,节省我们很多的片段着色器调用(它们的开销很大!)。但我们仍要告诉OpenGL哪些面是正向面(Front Face),哪些面是背向面(Back Face)。OpenGL使用了一个很聪明的技巧,分析顶点数据的环绕顺序(Winding Order)。
- 环绕顺序:当我们定义一组三角形顶点时,我们会以特定的环绕顺序来定义它们,可能是顺时针(Clockwise)的,也可能是逆时针(Counter-clockwise)的。每个三角形由3个顶点所组成,我们会从三角形中间来看,为这3个顶点设定一个环绕顺序。
每组组成三角形图元的三个顶点就包含了一个环绕顺序。OpenGL在渲染图元的时候将使用这个信息来决定一个三角形是一个正向三角形还是背向三角形。默认情况下,逆时针顶点所定义的三角形将会被处理为正向三角形。
当你定义顶点顺序的时候,你应该想象对应的三角形是面向你的,所以你定义的三角形从正面看去应该是逆时针的。这样定义顶点很棒的一点是,实际的环绕顺序是在光栅化阶段进行的,也就是顶点着色器运行之后。这些顶点就是从观察者视角所见的了。
观察者所面向的所有三角形顶点就是我们所指定的正确环绕顺序了,而立方体另一面的三角形顶点则是以相反的环绕顺序所渲染的。这样的结果就是,我们所面向的三角形将会是正向三角形,而背面的三角形则是背向三角形。下面这张图显示了这个效果:
在顶点数据中,我们将两个三角形都以逆时针顺序定义(正面的三角形是1、2、3,背面的三角形也是1、2、3(如果我们从正面看这个三角形的话))。然而,如果从观察者当前视角使用1、2、3的顺序来绘制的话,从观察者的方向来看,背面的三角形将会是以顺时针顺序渲染的。虽然背面的三角形是以逆时针定义的,它现在是以顺时针顺序渲染的了。这正是我们想要剔除(Cull,丢弃)的不可见面了!
在顶点数据中,我们定义的是两个逆时针顺序的三角形。然而,从观察者的方面看,后面的三角形是顺时针的,如果我们仍以1、2、3的顺序以观察者当面的视野看的话。即使我们以逆时针顺序定义后面的三角形,它现在还是变为顺时针。它正是我们打算剔除(丢弃)的不可见的面!
- 面剔除
- 要想启用面剔除,我们只需要启用OpenGL的GL_CULL_FACE选项:
glEnable(GL_CULL_FACE);
- 剔除背面
glEnable(GL_CULL_FACE);
glCullFace(GL_BACK);
glFrontFace(GL_CW);
- 剔除正面 告诉顺时针是正面,直接添加以下代码
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);