• 在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); 查看帧数在while循环的末尾添加如下代码 glfwPollEvents(); //立即处理已经到位的事件,如果没有这个就会一直渲染而不触发事件 glfwSwapBuffers(window); modelPicking(); static int ticks = -1; ticks++; static double _lastTime = glfwGetTime();
前情提要: 上一篇: OpenGL 学习笔记 I:OpenGL glew glad glfw glut 的关系,OpenGL 状态机,现代操作系统的窗口管理器,OpenGL 窗口和上下文 OpenGL context_我说我谁呢 --CSDN博客 讲解了 OpenGL glew glad glfw glut 的关系,一笔带过 OpenGL 状态机,几句话讲解了现代操作系统的窗口管理器,理解了 OpenGL 窗口和上下文 OpenGL context 的概念。 重新备注一下,这系列笔记可以认为是基于...
qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl实现缓冲qt+opengl
GLSLangSpec.3.30.6.clean.pdf glspec33.compatibility.20100311.pdf glspec33.compatibility.20100311.withchanges.pdf glspec33.core.20100311.pdf glspec33.core.20100311.withchanges.pdf PBR概念 PBR基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。相比Blinn-Pong光照算法更真实一些。 基于物理的渲染仍然只是对基于物理原理的现实世界的一种近似。 微平模型 所有的PBR技术都基于微平理论。这项理论认为,达到微观尺度之后任何平都可以用被称为微平(Microfacets)的细小镜来进行描绘。根 GLSL的内建变量: 我们已经学会使用顶点属性、uniform和采样器来完成这一任务了。然而,除此之外,GLSL还定义了另外几个以gl_为前缀的变量,它们能提供给我们更多的方式来读取/写入据。我们已经在前教程中接触过其中的两个了:顶点着色器的输出向量gl_Position,和片段着色器的gl_FragCoord。 顶点着色器变量 List item我们已经见过gl_Position了,它是顶点着色器的裁剪空间输出位置向量。如果你想在屏幕上显示任何东西,在顶点着色器中 #version 330 core layout (location = 0) in vec3 aPos; layout (location = 1) in vec2 aTexCoords; layout (location = 2) in vec3 aNormal; out vec2 TexCoords; out vec3 WorldPos; out vec3 Normal; uniform mat4 projection; uniform mat4 view; uniform mat.. 结合图形学内容 抗锯齿(Anti-aliasing,也被称为反走样) 超采样抗锯齿(Super Sample Anti-aliasing, SSAA)的技术,它会使用比正常分辨率更高的分辨率(即超采样)来渲染场景,当图像输出在缓冲中更新时,分辨率会被下采样(Downsample)至正常的分辨率。 多重采样抗锯齿(Multisample Anti-aliasing, MSAA) OpenGL光栅器:栅器会将一个图元的所有顶点作为输入,并将它转换为
文章目录原文学习前言一、前置条件1.内容2.难点二、前置代码(sheder和三角形等设置)1.画渲染2.Shader的使用3.材质信息4.在 shader 中进行三角形求交5.相机配置三、使用线性化的BVH树进行优化1. 构建BVH2. BVH 据传送到 shader3. 和 AABB 盒子求交4. 非递归遍历 BVH 树四、开始光线追踪1. 原理总结 GPU加速光线追踪 之前跟着上文作者的博客学习了蒙卡罗特路径追踪,在CPU端模拟实现光追效果图片。但是渲染消耗过大,如果想要实现的更