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