实时渲染中的菲涅尔效应
光线追踪中使用的菲涅尔效应公式由平行项 r_{\parallel} 和垂直项 r_{\perp} 组成,而且针对绝缘体和导体的公式又不相同,计算非常复杂。用于实时渲染必须进行简化。 菲涅尔效应 实际上,菲涅尔效应描述了光线的角度和光线反射率的关系。如果视线和法线夹角越大,眼睛接收到的反射光线能量越大;反之,夹 […]
光线追踪中使用的菲涅尔效应公式由平行项 r_{\parallel} 和垂直项 r_{\perp} 组成,而且针对绝缘体和导体的公式又不相同,计算非常复杂。用于实时渲染必须进行简化。 菲涅尔效应 实际上,菲涅尔效应描述了光线的角度和光线反射率的关系。如果视线和法线夹角越大,眼睛接收到的反射光线能量越大;反之,夹 […]
写在前面 光线追踪中最基础的部分是光线的传播和反射(一般把表面双向透射分布函数[BTDF]和双向反射分布函数[BRDF]统一处理为 BSDF,即双向散射分布函数),辐射度测量学则提供了相关数学概念,构成了基于物理渲染算法推导过程的基本内容。 本文使用和 PBRT 相同的左手系,即球坐标中 \phi 表示范围为 [0,2\p […]
OpenGL SuperBible中关于 gl_Position 的描述: Fortunately, GLSL includes a special input to the vertex shader calledgl_VertexID, which is the index of the vertex that is being processed at the tim […]
在 glsl 版本 1.30 之前,没有能与 sampler2DShadow 配合的纹理采样函数。在 1.40 版本开始,可以使用 texture 系的函数对阴影采样器进行采样,输入参数为 CVV 空间的三维坐标。 要使用 sampler2DShadow,需要做两件事。第一,需要开启比较模式,否则会行为未定义。有 sampler 或者 texture […]
glTexImage* 系列函数绝对是 OpenGL 最常用的函数。它的声明为: void glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const […]
OpenGL 4.3 的更新中,使用 glVertexAttribFormat 和 glBindVertexBuffer 取代 glVertexAttribPointer 来将 VBO 绑定到 VAO。由于老是忘记写法,故记录下来。本文使用 OpenGL 4.5 新增的 DSA 函数,最后会贴出与 4.3 函数的关系表,它们是一一对应的。 &em […]
写在前面 OpenGL 在 4.2 版本中增加了新的 glsl 变量 —— image 变量,详情请见 image variable。image 变量和 texture 变量非常相似,不同点在于 image 变量同时具有读和写的功能,而 texture 变量是只读的。由于 OpenGL 的历史遗留原因,glsl 中没有 texture 变量,只能使用 samp […]
线程支持库 C++ 11 中新增了支持线程(thread )、互斥(mutual exclusion)、条件变量(condition variables)和 std::future(期货)。 本节是 C++ 11 并发的第一节,主要介绍多线程运行时的基本高级接口——std::async() 和 std::future 以及底层接口 std::thread 和 std […]
写在前面 本文的坐标系及旋转均采用 OpenGL 的默认定义,位于右手系,并搭配使用 glm 数学库。 万向节锁和矩阵 在很多场合下,需要一个可以朝任意方向旋转的相机,比如,空战类游戏,建模程序。但是绕着多个轴组合一些旋转会导致万向节锁(Gimbal lock)的发生,这会导致不正确的结果。关于万向节锁的产生原因,本文不再赘述,详情请见 Gimbal lock。 由于矩阵表 […]