制作半球天空

Posted on 2009-02-24 16:32 Herbert 阅读(1797) 评论(0)  编辑 收藏 引用 所属分类: DirectX
    天空比较容易实现,而且一般在渲染过程中占用的资源不多,但在场景渲染中却起着十分重要的作用。如果效果不好会让人觉得像被蒙在一片布幕下面。玩过《古墓丽影——地下世界》以后十分羡慕游戏场景中的天空效果,做得非常真实!

       常用的天空盒一般有方形和半球形两种,但方形的天空盒漏洞比较大,很容易被人发现边角的位置。半球的天空盒看上去平滑些,但实现起来比方形的难些,而且如果搞不好,容易被人发现纹理拉伸不均匀。
   半球天空盒的实现方法也有多种。一种是把平面卷成管状,使其中一对对边重合,然后把管状的一头的边缘线挤到中点上,压缩成一个半球。

      

   另一种方法是把平面的中点作为半球的最高点,四个边往下凹,形成一个半球状。
   两种方法都存在纹理不均匀问题,第一种方法会使得半球顶部的纹理密度很大,四周纹理密度较小;第二种方法会使得平面对角线上的纹理密度大,其它地方密度小。感觉好像第一种的方法的问题没有第二种严重,但第一种方法还存在一个问题是要处理其中重合的对边纹理过度问题。
   下面是我用第二种方法实现的天空盒:

   上图的天空盒存在很严重的纹理不均匀,因为纹理寻址只是简单的按照平面网格中顶点的位置来确定。
这样会把纹理聚集在平面的对角线上。有一种解决办法是先把网格上的顶点坐标变换到半球形的相应位置,然后在半球的俯视图中确定顶点的纹理寻址。

      也就是只取纹理贴图内切圆(假设纹理是正方形的)内部的纹理。

   下面是修正纹理寻址后的效果:

    比原来的好些了,只是半球底部还有些拉伸的感觉。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理