Unity3D的渲染排序思路

主要的思路就是:

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


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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值