# games101_05 **Repository Path**: mo-si/games101_05 ## Basic Information - **Project Name**: games101_05 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-02-22 - **Last Updated**: 2022-03-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # games101_05 首先简单的说明以下光线追踪:考虑在一个针孔摄像机前面有一个成像平面,在成像平面前面就是场景。从针孔摄像机出发,连接在成像平面上的每一个像素中心点,形成一条射线,然后打出每一条射线,和场景中的物体相交,然后依据物体的材质考虑光线的下一步,如果是玻璃材质的物体,那么光线就会发生反射和折射,然后在打出这些新求出来的光线,重复上面的操作。对于光线和物体的交点,从这个点出发,连向光源,求解颜色值。在这个过程中也可通过判断该连线上有没有物体,来考虑是否需要生成阴影。对于光线上的这些颜色值,加权求和,得到的就是该像素点的颜色值。 Whitted-Style 的光线追踪。对于漫反射材质的物体,直接求解颜色,而不进行光线的多次弹射。对于像玻璃球这种材质的物体,考虑光线进行了多次弹射。当光线打到玻璃球上的时候,会发生折射和反射,此时在依据这些光线,递归的进行下去,直到打到漫反射材质的物体上或者递归的深度达到设定的一个值。在光线的弹射过程中,为了保证能量守恒,应用了菲涅尔项,来将光线分为透射部分(折射),和反射部分。 接下来说一几个问题: - 如何生成光线。 - 如何求光线和物体相交 #### 如何生成光线 我们知道摄像机的位置,我们只要知道成像平面上像素点的位置,我们就可以求出每一条射线。因此我们要做的就是求出屏幕上的像素点在世界坐标下的空间。首先我们在x,y加上0.5,因为我们要的是像素点的中心,之后进行缩放到(0,1)的范围内(就是除以长宽),接着在变换到(-1,1)的范围内去,这里要注意y轴是倒转过来的。还有一个问题要注意的就是,如果成像平面不是正方形,那么进行缩放之后,会导致像素点变成长方形而不是正方形,所以还要重新进行矫正,变回正方形。最后考虑一下视野的问题,也就是FOV就ok了。 #### 光线求交 这里分为两种情况,隐式平面,显示平面。隐式,就是直接用函数来表示的。在此代码中,球就是用函数直接表示的,此时求交就是解球和直线相交的问题,直接求出坐标就可以了。显示平面,就是用三角形面来直接表示的,这样的求交用 Moller Trumbore 算法,就行了。 这里有一个问题就是,我们必须遍历场景中所有的物体,才能知道光线到底和哪一个物体相交,因为该场景很简单可以直接这样做,但是如果场景变得复杂了,就必须要用到加速结构了。