Unity3D的渲染排序思路

论坛 期权论坛 脚本     
匿名网站用户   2020-12-20 03:32   29   0

主要的思路就是:

场景中有各种各样的物体要渲染,那么渲染排序的意思就是,哪一些物体是先渲染,哪一些跟着渲染,哪一些最后渲染,等等。


1.

在材质上声明这个物体是什么时候渲染的。

例如:

enum RenderQueue {
  RQ_UNKNOW = 0,
  RQ_BACKGROUND = 1000,
  RQ_OPAQUE = 3000,
  RQ_ALPHATEST = 5000,
  RQ_TRANSPARENT = 7000,
  RQ_OVERLAP = 9000,
 };

2.

所有的物体的材质都声明了RenderQueue 的tag,那么,就可以开始收集每一个物体的渲染信息,例如物体离摄像机多远什么的,把这个物体和对应的渲染信息塞到一个struct中,这些struct的实例组成一个list。

struct RenderInfo {
 union RenderObject
 {
  Model *model;
  

 };
 enum RenderObjectType{
  MODEL = 1,
  

 };
 
 RenderObject obj;
 RenderObjectType type;
 bool isTransparent;

 int renderQueue;
 int offset;
 float distance;
};


3.

之后,就利用distance,

enum RenderQueue
来sort这个list,sort之后,就可以进行渲染了,sort之后,物体就按一定的顺序进行渲染了。

qsort(_renderInfos, _renderInfosSize, sizeof(_renderInfos[0]), RenderInfoComp);

   for (int i = 0; i < _renderInfosSize; ++i) {
    switch (_renderInfos[i].type)
    {
    case RenderInfo::MODEL:
     _renderInfos[i].obj.model->draw(false);
     break;
    default:
     break;
    }  
   }


static int RenderInfoComp(const void *arg1, const void *arg2) 
{
 RenderInfo *ri1 = (RenderInfo*)arg1;
 RenderInfo *ri2 = (RenderInfo*)arg2;

 int dq = ri1->renderQueue - ri2->renderQueue;
 if (dq != 0) {
  return dq;
 } 

 return  ri1->distance - ri2->distance;
}





分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1136255
帖子:227251
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP