- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
PAGE5/NUMPAGES5
PAGE5/NUMPAGES5
7.2法线向量
平面法线(facenormal)是描述多边形所朝方向的单位向量(即,它与多边形上的所有点相互垂直),如图7.4a所示。表面法线(surface)是与物体表面上的点的正切平面(tangentplane)相互垂直的单位向量,如图7.4b所示。表面法线确定了表面上的点“面对”的方向。
图7.4(a)平面法线与平面上的所有点相互垂直。(b)表面法线与物体表面上的点的正切平面相互垂直。
在光照计算过程中,必须为三角形网格表面上的每个点求解表面法线,以确定光线与网格表面在该点位置上的入射角度。为了获取表面法线,必须为每个顶点指定表面法线(这些法线称为顶点法线)。然后,在光栅化阶段,这些顶点法线会在三角形表面上进行线性插值,使三角形表面上的每个点都获得一个表面法线。5.10.3节并参见图7.5)。
图7.5p0和p1是线段的两个顶点,n0和n1是对应的顶点法线。点p是通过线性插值(加权平均值)得到的线段上的一点,n是点p的法线向量,它介于两个顶点法线之间。也就是,当存在一个位置使p=p0+t(p1–p0)时,n=n0+t(n1–n0)。为了简单起见,我们只解释了线段的法线插值,但是一概念可以被直接扩展为3D三角形的法线插值。
注意:对每个像素的法线进行插值,并进行光照计算称为逐像素光照或光照是渲染过程中的一个重要环节,它影响着场景的视觉效果。在计算光照时,我们通常采用两种方法:一是逐顶点光照,即对每个顶点进行单独的光照计算;二是从像素着色器到顶点着色器的插值计算。
逐顶点光照是一种较为简单且精确的方法,它通过在每一个顶点上独立地进行光照计算,然后输出结果给像素着色器进行插值处理。这种方法能够确保每个顶点的光照效果都能够得到准确的反映,但在性能方面可能不如插值计算高效。
而插值计算则是将计算过程从像素着色器转移到顶点着色器,通过在顶点着色器中进行插值运算来得到最终的光照效果。这种方法虽然在性能上有所牺牲,但在很多情况下,其视觉表现与逐像素光照差别不大,因此成为了一种常见的优化手段。
总之,在选择光照计算方法时,需要根据具体的场景需求和性能要求来进行权衡。无论是逐顶点光照还是插值计算,都需要确保最终的光照效果能够满足设计要求,同时也要考虑性能优化的效果。
7.2.1计算法线向量
为了求解一个三角形Δp0p1p2的平面法线,我们必须先计算该三角形边上的两个向量:
up1?p0
v=p2?p0
然后求得平面法线为:
下面的函数可以根据三角形的3个顶点来计算三角形正面(参见5.10.2节)的平面法线。
void3p0,
3p1,
3p2,
XMVector3out)
{
XMVector3u=p1-
XMVector3v=p2-
XMVector3Cross(out,u,v);
XMVector(out,out);
}
对于微分曲面,我们可以通过微积分计算曲面上的点的法线。然而,三角形网格并非微分曲面。我们通常使用一种称为顶点法线平均值的方法来计算曲面上的点法线。vertexnormalaveraging)
的技术求解三角形网格上的顶点法线。对于网格上的任意顶点v来说,v的顶点法线n等于以v为共享顶点的每个多边形的平面法线的平均值。例如在图7.6中,网格上的四个多边形共享顶点v;所以,v的顶点法线为:
图7.6中间的顶点由相邻的4个多边形共享,我们通过计算这4个多边形平面法线的平均值就可以估算出该顶点的法线。
在上面的例子中,我们不需要除以4为求得一个普通平均值,我们可对结果进行规范化处理。此外,还可以设计更为巧妙的平均值计算方法;例如,以每个多边形的面积作为权重,来计算加权平均值,这样,面积较大的多边形在总和中所占比重较大,而面积较小的多边形则相对较小。
下面的伪代码说明了在给出一个三角形网格的顶点列表和索引列表时,如何计算该平均值:
//输入:
//一个顶点数组(mVertices),每个顶点都有一个位置分量(pos)和
//一个法线分量(normal).
//2.一个索引数组(ms)。
//处理网格中的每个三角形:
for(DWORDi=0;imNumTriangles;++i)
{
//第i个三角形的索引
UNITi0=mIndices[i*3+0];
UNITi1=mIndices[i*3+1];
ITi2=mIndices[i*3+2];
//第i个三角形的顶
文档评论(0)