主要的思路就是:
场景中有各种各样的物体要渲染,那么渲染排序的意思就是,哪一些物体是先渲染,哪一些跟着渲染,哪一些最后渲染,等等。
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;
};
之后,就利用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;
}