#ifndef HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE #define HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE #include #include #include #include VK_NAMESPACE_BEGIN /** * 可渲染对象实例
* RenderList会统一管理Shader中的LocalToWorld数据,使用DynamicUBO/DynamicSSBO实现。 */ class RenderableInstance ///可渲染对象实例 { Pipeline * pipeline; MaterialParameters * mat_inst; Renderable * render_obj; DescriptorSets * descriptor_sets; ///<渲染实例专用描述符合集,一般用于存LocalToWorld等等 uint32_t buffer_count; VkBuffer * buffer_list; VkDeviceSize * buffer_size; uint32_t buffer_hash; private: friend RenderableInstance *CreateRenderableInstance(Renderable *,MaterialParameters *,Pipeline *); RenderableInstance(Renderable *,MaterialParameters *,Pipeline *,const uint32_t,VkBuffer *,VkDeviceSize *); public: virtual ~RenderableInstance(); Pipeline * GetPipeline (){return pipeline;} MaterialParameters * GetMaterialInstance (){return mat_inst;} Renderable * GetRenderable (){return render_obj;} const AABB & GetBoundingBox ()const{return render_obj->GetBoundingBox();} const uint32_t GetBufferCount ()const{return buffer_count;} VkBuffer * GetBuffer ()const{return buffer_list;} VkDeviceSize * GetBufferSize ()const{return buffer_size;} IndexBuffer * GetIndexBuffer ()const{return render_obj->GetIndexBuffer();} const uint32_t GetIndexBufferOffset()const{return render_obj->GetIndexBufferOffset();} const uint32_t GetDrawCount ()const{return render_obj->GetDrawCount();} const uint32_t GetBufferHash ()const{return buffer_hash;} DescriptorSets * GetMIDescSets ()const{return mat_inst->GetDescriptorSets();} DescriptorSets * GetRIDescSets ()const{return descriptor_sets;} public: const int Comp(const RenderableInstance *ri)const { //绘制顺序: // ARM Mali GPU : 不透明、AlphaTest、半透明 // Adreno/NV/AMD: AlphaTest、不透明、半透明 // PowerVR: 同Adreno/NV/AMD,但不透明部分可以不排序 if(pipeline->IsAlphaBlend()) { if(!ri->pipeline->IsAlphaBlend()) return 1; } else { if(ri->pipeline->IsAlphaBlend()) return -1; } if(pipeline->IsAlphaTest()) { if(!ri->pipeline->IsAlphaTest()) return 1; } else { if(ri->pipeline->IsAlphaTest()) return -1; } if(pipeline!=ri->pipeline) return pipeline-ri->pipeline; if(mat_inst!=ri->mat_inst) return int64(mat_inst)-int64(ri->mat_inst); return render_obj-ri->render_obj; } CompOperator(const RenderableInstance *,Comp) };//class RenderableInstance RenderableInstance *CreateRenderableInstance(Renderable *,MaterialParameters *,Pipeline *); VK_NAMESPACE_END #endif//HGL_GRAPH_RENDERABLE_INSTANCE_INCLUDE