Example #1
0
	void CModelMeshNode::renderInstanced(E_PIPELINE_USAGE usage, u32 instanceCount, IMeshBuffer* instanceBuffer)
	{
		if (instanceCount == 0)
			mMesh->bind();
		else
			mMesh->bind(instanceBuffer);

		IPipeline* prePipeline = nullptr; /* 记录前一个流水线 */
		IMaterial* preMaterial = nullptr; /* 记录前一个子集的材质 */

		u32 subsetCount = mMesh->getSubsetCount();

		for (u32 i = 0; i < subsetCount; i++)
		{
			IMaterial* material = mMaterials[i];
			if (!material)
				continue;

			IPipeline* pipeline = material->getPipeline(usage);
			if (!pipeline)
				continue;

			//如果当前的流水线和上一条相同,则除了材质外的其他变量不用注入
			if (pipeline == prePipeline)
			{
				//当且仅当材质也不同于上一个时才注入
				if (preMaterial != material)
				{
					CShaderVariableInjection::injectMaterial(material, pipeline);
					pipeline->apply(usage);
				}
			}
			else // 如果两条流水线不同,全部变量都需要更新
			{
				CShaderVariableInjection::inject(this, pipeline, i);
				pipeline->apply(usage);
				prePipeline = pipeline;
			}


			if (instanceCount == 0)
				mMesh->drawSubset(i);
			else
				mMesh->drawSubsetInstanced(i, instanceCount);

			preMaterial = material;
		}
	}