多Pass渲染体系与多线程渲染的矛盾
来源:互联网 发布:先付款钱在淘宝上 编辑:程序博客网 时间:2024/05/22 12:58
最近为了实现多光源和多阴影的渲染,把渲染系统改成了多Pass的,对每一个可见光源进行一次光照、ShadowMap和最终阴影的渲染,虽然这样等于是把整个场景重复渲染了很多次,但为了实现灵活的实时光照系统,这似乎是唯一的办法了。
但实践后发现,阴影和光照会随着骨骼动画的播放而闪烁,甚至镜头的移动也会造成闪烁,究其原因,还是逻辑线程和渲染线程的同步问题,由于对场景内的同一个物体渲染了多次,而逻辑线程又在不停的更新摄像机和骨骼动画数据,导致了两Pass渲染取到的数据很可能不一致,造成了光照和阴影的闪烁。
所以共享数据结构必须做一些修改,在多Pass渲染开始前进行一次备份,渲染中只取备份数据,这样就保证了多次渲染的数据一致性了
也就是加这么两个简单的set和get方法,在渲染相关数据读取时调用get,逻辑相关时调用read
但实践后发现,阴影和光照会随着骨骼动画的播放而闪烁,甚至镜头的移动也会造成闪烁,究其原因,还是逻辑线程和渲染线程的同步问题,由于对场景内的同一个物体渲染了多次,而逻辑线程又在不停的更新摄像机和骨骼动画数据,导致了两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;
}
};
- 多Pass渲染体系与多线程渲染的矛盾
- DX11与多线程渲染
- 渲染通路(Pass)
- Ogre 渲染通路(Pass)
- 多线程渲染
- 多线程渲染
- 前端渲染与后端渲染的区别
- OGRE 渲染通路(Pass)
- OGRE 渲染通路(Pass)
- UnityShader:选择Pass渲染通道
- 【猫猫的Unity Shader之旅】之双面材质和多Pass渲染
- OGRE 渲染通路(Pass) 的部分属性
- Light Pre-Pass 渲染器----为多光源设计一个渲染器
- Light Pre-Pass 渲染器----为多光源设计一个渲染器
- Light Pre-Pass 渲染器----为多光源设计一个渲染器
- Light Pre-Pass 渲染器----为多光源设计一个渲染器
- 多线程第二步:渲染与逻辑分离
- 图片的拉伸与渲染
- android中dip、px相互换算
- ZEM总结
- MySQL性能优化的21个最佳实践
- 《Red5 用户参考手册》之六:入门第五章 构建 Red5
- dynamic_cast<type>()转型与typeid()的使用
- 多Pass渲染体系与多线程渲染的矛盾
- 一位软件工程师的6年总结
- 关于如何选好游戏3D引擎编程的一些经验
- 东软2012校园招聘笔试试题(B)
- 【编译原理】正则表达式
- 调用操作系统命令
- DX11与多线程渲染
- SilverLight:”无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本”的解决方案。
- ace技术内幕示例代码