Unity3D的渲染排序思路

NO IMAGE

主要的思路就是:

場景中有各種各樣的物體要渲染,那麼渲染排序的意思就是,哪一些物體是先渲染,哪一些跟著渲染,哪一些最後渲染,等等。

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;
}