C++中的RTTI架构
在 C++ 中,默认提供的运行时类型信息(Run-Time Type Information, RTTI)主要有三个目的: 支持 typeid 操作符 匹配以及捕获抛出的异常(异常分配器) 实现 dynamic_cast 操作符 dynamic_cast 只关注于继承多态的相关转换操作,而 typeid 以及 […]
在 C++ 中,默认提供的运行时类型信息(Run-Time Type Information, RTTI)主要有三个目的: 支持 typeid 操作符 匹配以及捕获抛出的异常(异常分配器) 实现 dynamic_cast 操作符 dynamic_cast 只关注于继承多态的相关转换操作,而 typeid 以及 […]
许多事情在生活中太难以评估,特别是当它涉及非常大的数字。例如,计算一个国家的成年人口的平均高度,将需要测量每个人的身高,身高值相加除以总人数。这明显是不可能的,这种任务需要很长的时间,非常难以求解。在这种情况下,可以做的是取一个样本的人口并计算其平均高度,以此来估算整个国家人口的平均高度。这是统计学中最简单的概念。 需要特别提醒的是,在这个例子中,随机选取的人的身高是随机数, […]
光线追踪(Ray tracing)是三维计算机图形学中的特殊渲染算法,跟踪从眼睛发出的光线而不是光源发出的光线,通过这样一项技术生成编排好的场景的数学模型显现出来。这样得到的结果类似于光线投射与扫描线渲染方法的结果,但是这种方法有更好的光学效果,例如对于反射与折射有更准确的模拟效果,并且效率非常高,所以当追求高质量的效果时经常使用这种方法。 光线追踪分为两种: […]
现实中人类的眼睛所能看到亮度比的范围是10^5左右。照相机和摄像机可以捕捉到HDR的影响,渲染过程中可以产生HDR的画面。这样问题就出现了,2^{16}或者更高数量级的亮度只能存在电脑里,而一般的显示器只能表示2^8个亮度数量级,用256个数字来模拟 所能表示的信息,这种模拟的方法就是HDR技术核心内容之一,学名叫Tone-Mapping(色调映 […]
前言 如果要将相机数据、光源数据同时传给地形着色器、阴影着色器等等要怎么做?一种简单的办法是在每个着色器中设置同样的 uniform 变量,然后各自赋值。但这个方法仍然显得太麻烦,有没有方法将数据存储在某个地方,然后需要的着色器自行读取呢?答案肯定是有的。 GLSL 3.1 版本开始支持 uniform block 的数据结构,它可以和 OpenGL 中定义的 uniform bu […]
在2017年的 SIGGRAPH 上,Khronos 突然推出了 OpenGL 4.6。相比 OpenGL 4.5,这个版本加入了一些 Vulkan 的技术,进一步完善了 OpenGL。这代表OpenGL还没终结,以后还会绽放新的活力。 这几个扩展进入了核心: GL_ARB_gl_spirv 和 GL_ARB […]
光线追踪中使用的菲涅尔效应公式由平行项 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 […]