使用梯度来估计法线

      写在前面   一般来说,法线贴图不是由美术直接制作的。法线贴图的制作通常有两个途径: – 由灰度图、高度图进行生成,通过这种途径生成的法线会丢失许多细节。 – 进行高精度建模,然后把相应的表面凹凸信息写入法线贴图或者视差贴图,再把高模减面成适合游戏使用的低精度模型,然后将生成的贴图应用在模型上,这种方式可以拥有各种细节。   这篇文 […]

OpenGL阴影采样器

  在 glsl 版本 1.30 之前,没有能与 sampler2DShadow 配合的纹理采样函数。在 1.40 版本开始,可以使用 texture 系的函数对阴影采样器进行采样,输入参数为 CVV 空间的三维坐标。   要使用 sampler2DShadow,需要做两件事。第一,需要开启比较模式,否则会行为未定义。有 sampler 或者 texture […]

OpenGL纹理格式

  glTexImage* 系列函数绝对是 OpenGL 最常用的函数。它的声明为:

  其中有三个描述纹理数据信息的变量 internalformat、format 和 type,它们有时会让人感到困扰。 internalformat : 表示在纹理中实际存储的数据信息,决定底层数据(比如上 […]

OpenGL 4.5如何绑定VBO

      OpenGL 4.3 的更新中,使用 glVertexAttribFormat 和 glBindVertexBuffer 取代 glVertexAttribPointer 来将 VBO 绑定到 VAO。由于老是忘记写法,故记录下来。本文使用 OpenGL 4.5 新增的 DSA 函数,最后会贴出与 4.3 函数的关系表,它们是一一对应的。 &em […]

OpenGL中的image变量

  写在前面   OpenGL 在 4.2 版本中增加了新的 glsl 变量 —— image 变量,详情请见 image variable。image 变量和 texture 变量非常相似,不同点在于 image 变量同时具有读和写的功能,而 texture 变量是只读的。由于 OpenGL 的历史遗留原因,glsl 中没有 texture 变量,只能使用 samp […]

C++11新特性——启动线程

    线程支持库   C++ 11 中新增了支持线程(thread )、互斥(mutual exclusion)、条件变量(condition variables)和 std::future(期货)。   本节是 C++ 11 并发的第一节,主要介绍多线程运行时的基本高级接口——std::async() 和 std::future 以及底层接口 std::thread 和 std […]

四元数相机

    写在前面   本文的坐标系及旋转均采用 OpenGL 的默认定义,位于右手系,并搭配使用 glm 数学库。   万向节锁和矩阵   在很多场合下,需要一个可以朝任意方向旋转的相机,比如,空战类游戏,建模程序。但是绕着多个轴组合一些旋转会导致万向节锁(Gimbal lock)的发生,这会导致不正确的结果。关于万向节锁的产生原因,本文不再赘述,详情请见 Gimbal lock。   由于矩阵表 […]

C++11 新特性——强类型枚举

    强类型枚举   C++ 有一个奇怪的设定,有名字的 enum 类型的名字和 enum 成员的名字都是全局可见的。比如下面这种情况,就会导致编译错误。

  如果能够提示错误,那非常好。但是如果其中一个被新的 namespace 所包围,就很容易出现错误。

  上 […]

C++11 新特性——类型推导

    写在前面   C++ 是有四个相关语言组成的联邦——C、object-C、template C++、STL。如果需要将这些东西全部杂糅到一起,总会出现一些抵触的情况,C++ 的编码也会变得更复杂。新标准增加了许多新特性,使得 C++ 更加易用。这些新特性是紧密相连,互为基础的。   在C++11中,规范提供了多种类型推导的机制,使得我们写出来的代码更精简、更灵活。   这个新的类型推导机制 […]