- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Nvidia CUDA全国程序设计大赛
命题2:光线和三角形求交算法的并行化
在光线跟踪或光线投射算法中,涉及到大量的光线和三角形面片求交计算,具体来说,对于光线投射或一遍光线跟踪来说,我们需要从视点出发向屏幕每个像素引出一条光线,然后计算出这条光线跟物体的交点,然后把交点的颜色作为屏幕上对应像素的颜色值,这样得到整个三维场景的渲染效果图。显然,每根光线跟三角形面片的计算是相互独立的,而且某一根光线跟每个三角形之间也是相互独立的。这里存在着大量平行的可能性。
问题:
利用CUDA计算出每一条光线跟三角形的交点,注意有可能其中一些光线跟所有的三角形都不相交,如果某根光线跟多个三角形相交,则只返回离视点最近的那个交点的坐标。
输入:视点位置,屏幕坐标点,三角形面片集合
其中三角形集合的格式类似标准的Wave front的obj格式,这里用更简化的形式来描述,即只包含顶点序列和三角形序列。
文件格式如下:
顶点数
x,y,z(即顶点1三维坐标值)
x,y,z(即顶点2三维坐标值)
…
三角形数
v1 v2 v3(即三角形1顶点序号)
v1 v2 v3(即三角形2顶点序号)
…
一些提示:
暴力算法不是好算法;
光线由视点与屏幕坐标点连线构成;
场景可以利用二叉树划分,包围盒等技术来加速;
某些光线可以按簇来处理
参考文献:
Timothy J. Purcell, Ian Buck, William R. Mark, and Pat Hanrahan, Ray Tracing on Programmable Graphics Hardware,ACM Transactions on Graphics. 21 (3), pp. 703-712, 2002.
Min Shih, Yung-Feng Chiu, Ying-Chieh Chen and Chun-Fa Chang, Real-Time Ray Tracing with CUDA,Lecture Notes in Computer Science, Volume 5574/2009.
www.GPGPU.org
/object/cuda_home_new.html
/object/nvision08-IRT.html
注:下面是计算机图形学中整个光线跟踪的伪代码(参考彭群生教授编写的《计算机图形学应用基础》),但本竞赛题只需求出一遍光线与三角形面片的交点,即黑体部分。
附录:
光线跟踪的伪代码
main ( ) //主函数
{
for(需要计算颜色的每一像素pixel) {
确定通过视点V和像素pixel的光线R;
depth = 0; // 递归深度
ratio = 1.0; //当前光线的衰减系数,1.0表示无衰减
// color是经计算后返回的颜色值
RayTrace(R, ratio, depth, color);
置当前像素pixel的颜色为color;
}
} // 主函数main( )结束
RayTrace(R, ratio, depth, color) //说明:光线跟踪子函数
{
if(ratio THRESHOLD) { //终止条件2
置color为黑色;
return;
}
if(depth MAXDEPTH) { //终止条件3
置color为黑色;
return;
}
// to be continued
光线R与场景中的所有物体求交。若存在交点,找出离R起始点最近的交点P;
if(交点不存在) { //终止条件1
置color为黑色;
return;
}
用局部光照明模型计算交点P处的颜色值,并将其存入local_color;
// to be continued
if(交点P所在的表面为光滑镜面) {
计算反射光线Rr;
//递归调用!
RayTrace(Rr, ks*ratio, depth+1, reflected_color);
}
if(交点P所在的表面为透明表面) {
计算透射光线Rt;
//递归调用!
RayTrace(Rt, kt*ratio, depth+1,transmitted_color);
}
// to be continued
依照Whitted模型合成最终的颜色值,即:
color = local_color + ks*reflected_color +
kt*transmitted_color;
return;
} // 光线跟踪子函数Ray
文档评论(0)