diff --git a/native/cocos/renderer/pipeline/Define.h b/native/cocos/renderer/pipeline/Define.h index df99d368774..9da114fcf3d 100644 --- a/native/cocos/renderer/pipeline/Define.h +++ b/native/cocos/renderer/pipeline/Define.h @@ -75,6 +75,7 @@ struct CC_DLL RenderPass { uint32_t shaderID = 0; uint32_t passIndex = 0; const scene::SubModel *subModel = nullptr; + uint32_t subModelID = 0; }; using RenderPassList = ccstd::vector; @@ -185,7 +186,11 @@ inline bool opaqueCompareFn(const RenderPass &a, const RenderPass &b) { return a.depth < b.depth; } - return a.shaderID < b.shaderID; + if(a.shaderID != b.shaderID) { + return a.shaderID < b.shaderID; + } + + return a.subModelID < b.subModelID; } inline bool transparentCompareFn(const RenderPass &a, const RenderPass &b) { @@ -203,7 +208,11 @@ inline bool transparentCompareFn(const RenderPass &a, const RenderPass &b) { return b.depth < a.depth; } - return a.shaderID < b.shaderID; + if(a.shaderID != b.shaderID) { + return a.shaderID < b.shaderID; + } + + return a.subModelID < b.subModelID; } inline uint32_t convertPhase(const ccstd::vector &stages) { diff --git a/native/cocos/renderer/pipeline/RenderQueue.cpp b/native/cocos/renderer/pipeline/RenderQueue.cpp index 854daad29ea..0477759f7a1 100644 --- a/native/cocos/renderer/pipeline/RenderQueue.cpp +++ b/native/cocos/renderer/pipeline/RenderQueue.cpp @@ -60,7 +60,8 @@ bool RenderQueue::insertRenderPass(const RenderObject &renderObj, uint32_t subMo auto shaderId = static_cast(reinterpret_cast(subModel->getShader(passIdx))); const auto hash = (0 << 30) | (passPriority << 16) | (modelPriority << 8) | passIdx; const auto priority = renderObj.model->getPriority(); - RenderPass renderPass = {priority, hash, renderObj.depth, shaderId, passIdx, subModel}; + const auto subModelID = subModel->getId(); + RenderPass renderPass = {priority, hash, renderObj.depth, shaderId, passIdx, subModel, subModelID}; _queue.emplace_back(renderPass); return true;