图形渲染管线可以计算phong光照模型,由于该模型的特征,使得渲染的物体
phong模型就无能为力了。和固定渲染管线相比,可编程图形渲染管线的力能
对环境的反射效果。但是这种环境反射只能反射出已经保存在CubeMap中的图
来看看下面的Fig1,在Fig1中是一个虚拟的场景,场景中有2个球和1个圆
一条射线与该物体相交后,射线还会在该点产生反射和折射等。例如在Fig2中,
那么就要提供公共的成员方法来访问它们,于是我们还需要set和get方法。
最后,getPoint(double)方法是通过向射线的参数方程传入参数t而获得在射
线上的点。实现了射线CRay类后,那么在使用光线追踪计算每个像素颜色的时
循环里计算出每个像素的位置。如果我们假设Fig1中,四边形屏幕处于xy平
面,长和宽分别是40和30,且左上顶点坐标和右下顶点坐标分别为(-20,15,0)
和(20,-15,0)。为了将该屏幕映射到实际分辨率为800*600的窗口上,就要求
出虚拟屏幕上每个像素的坐标pixel_x和pixel_y。然后对每一个像素都用一
(m_Ka),漫反射系数(m_Kd),镜面反射系数(m_Ks),镜面反射强度
都的类型都是protected,因为我们要把CGObject最为物体的基类,这些
protected 成员变量可以被该类的子类所继承。该类的所有get 方法和set 方
用是获取物体表面一点的法线,它接受一个GVector3 类型的参数_Point,并返
回物体表面点_Point 处的法线。当然不同物体表面获得法线的方法是不一样的。
继承了该方法的子类,都可以实现自己的getNormal()方法。同样的道理,函
和距离Distance,CRay 是输入参数,用于判断射线和该物体的交点,
Distance 是输出参数,如果物体和射线相交,则返回相机到该交点的距离。
Distance 还应该有个很大初始值,表示在无限远处物体和射线相交,这种情况
用于判断物体和射线没有交点。函数isIntersected()还返回一个枚举类型
其中INTERSECTED_IN 表示射线从物体内部出发并和物体有交点,MISS
射线和物体没有交点,INTERSECTED 表示射线从物体外部出发并且和物体有交
的子类可以实现自己的isIntersected()方法。下面的代码就可以判断一条射
作为球,只需要提供球心Center 和半径Radius 就可以决定它的几何
性质。所以CSphere 类只有两个私有成员变量。在所有成员函数中,我们重点
现在我们实现了射线CRay,球体CSphere,还差一个重要的角色--光
源。光源也是物体的一种,完全可以从我们的基类CGObject 类继承。这里做一
点区别,我们单独创建一个所有光源的基类CLightSource,然后从它在派生出
光源CSpotLight。本文中只详细讲解平行光源的情况,其他两种光源有兴趣的
类CLightSource 的成员变量有四个,分别表示光源的位置,光源的环
境光成分,漫反射成分和镜面反射成分。同样地,所有的set 和get 方法都为
该类的子类提供相同的功能。最后也有三个虚成员函数,EvalAmbient(),
回GVector3 类型的值--颜色。由于对于不同种类的光源,计算方法可能不同,
源类里面,当然你也可以放在物体类CGObject 里,也可以单独写一个方法,将
量,R 是反射向量,n 就反射强度Shininess。为了提高计算效率,也可以利用
Tracer()方法,因为反射是一个递归的过程,一但一条射线被物体反射,那么
同样的Tracer()方法就要被执行一次来计算被反射光线和其他物体是否还有交
点。于是,在Tracer()方法中再传入一个代表递归迭代深度的参数depth,它
表示射线与物体相交后反射的次数,如果为 1,说明射线与物体相交后不反射,
踪来说是很重要的,可以通过场景管理、使用GPU 或CUDA 等等技术来提高渲染
Copyright © 2025 九游会(J9)股份有限公司 版权所 备案号:辽ICP备2024029092号-1
扫一扫咨询微信客服