flagship的理想与现实

创新+实践

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  8 Posts :: 0 Stories :: 27 Comments :: 0 Trackbacks

常用链接

留言簿(8)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

    最近为了实现多光源和多阴影的渲染,把渲染系统改成了多Pass的,对每一个可见光源进行一次光照、ShadowMap和最终阴影的渲染,虽然这样等于是把整个场景重复渲染了很多次,但为了实现灵活的实时光照系统,这似乎是唯一的办法了。
    但实践后发现,阴影和光照会随着骨骼动画的播放而闪烁,甚至镜头的移动也会造成闪烁,究其原因,还是逻辑线程和渲染线程的同步问题,由于对场景内的同一个物体渲染了多次,而逻辑线程又在不停的更新摄像机和骨骼动画数据,导致了两Pass渲染取到的数据很可能不一致,造成了光照和阴影的闪烁。
    所以共享数据结构必须做一些修改,在多Pass渲染开始前进行一次备份,渲染中只取备份数据,这样就保证了多次渲染的数据一致性了

    也就是加这么两个简单的set和get方法,在渲染相关数据读取时调用get,逻辑相关时调用read

template <class T>
struct SharedData
   
{
        T        m_pData[DATACENTER_CACHE];
        T        m_kCloneData;
        
int      m_iIndex;

        SharedData()
      
{
            ZeroMemory( m_pData, DATACENTER_CACHE 
* sizeof(T) );
            m_iIndex 
= 0;
        }


        
void    Write( T& rData )
      
{
            
int iNewIndex = m_iIndex == DATACENTER_CACHE - 1 ? 0 : m_iIndex + 1;
            m_pData[iNewIndex] 
= rData;
            m_iIndex 
= iNewIndex;
        }


        T
&    Read()
      
{
           
return m_pVector[m_iIndex];
        }


        
void    Set()
      
{
           m_kCloneData 
= Read();
        }


        T
&      Get()
      {

           
return m_kCloneData;
        }

    }
;

posted on 2009-03-15 12:45 flagship 阅读(2763) 评论(3)  编辑 收藏 引用 所属分类: FlagshipEngine

Feedback

# re: 多Pass渲染体系与多线程渲染的矛盾 2009-03-16 21:34 seesea
关注中...

不知道楼主是否对ogre的多线程渲染系统有了解么?以下是它的文档和代码下载地址:
http://www.intel.com/cd/ids/developer/apac/zho/dc/games/333061.htm
不知道对楼主有没有帮助!
还有你这个引擎好像只支持dx,是否可考虑像ogre那样把渲染系统抽象出来。

本人现在也正在准备写一个plant engine,希望多多交流。  回复  更多评论
  

# re: 多Pass渲染体系与多线程渲染的矛盾 2009-03-17 22:47 flagship
@seesea
首先我不考虑支持opengl
当初设计的时候也曾考虑抽象渲染层
但发现dx9和dx10API差距太大了,不好抽象
所以就干脆就写了两个完整的渲染器
下几篇介绍下渲染结构~~
  回复  更多评论
  

# re: 多Pass渲染体系与多线程渲染的矛盾 2009-09-16 15:24 Combine
OGRE里已经把dx9和dx10API抽象了,楼主可以了解一下。
另,楼主有没有考虑过如果加上网络下载线程时多线程的设计?  回复  更多评论
  


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