画矩形改为使用4个顶点数据的FAN形

This commit is contained in:
hyzboy 2019-05-23 14:55:07 +08:00
parent 96d9132b29
commit 5ec1dee6b5
2 changed files with 133 additions and 10 deletions

View File

@ -30,6 +30,81 @@ struct RectangleCreateInfo
RectScope2f tex_coord; RectScope2f tex_coord;
}; };
VK_NAMESPACE_BEGIN
/**
* DB
*/
class SceneDatabase
{
Set<Material *> material_sets; ///<材质合集
Set<Pipeline *> pipeline_sets; ///<管线合集
Set<DescriptorSets *> desc_sets_sets; ///<描述符合集
Set<Renderable *> renderable_sets; ///<可渲染对象合集
};//class SceneDatabase
/**
*
*/
class RenderableInstance
{
Pipeline * pipeline;
DescriptorSets * desc_sets;
Renderable * render_obj;
public:
RenderableInstance(Pipeline *p,DescriptorSets *ds,Renderable *r):pipeline(p),desc_sets(ds),render_obj(r){}
virtual ~RenderableInstance()=default;
Pipeline * GetPipeline (){return pipeline;}
DescriptorSets *GetDescriptorSets (){return desc_sets;}
Renderable * GetRenderable (){return render_obj;}
const int Comp(const RenderableInstance *ri)const
{
//绘制顺序:
// ARM Mali GPU : 不透明、AlphaTest、半透明
// Adreno/NV/AMD: AlphaTest、不透明、半透明
// PowerVR: 同Adreno/NV/AMD但不透明部分可以不排序
if(pipeline->IsAlphaTest())
{
if(!ri->pipeline->IsAlphaTest())
return -1;
}
else
{
if(ri->pipeline->IsAlphaTest())
return 1;
}
if(pipeline->IsAlphaBlend())
{
if(!ri->pipeline->IsAlphaBlend())
return 1;
}
else
{
if(ri->pipeline->IsAlphaBlend())
return -1;
}
if(pipeline!=ri->pipeline)
return pipeline-ri->pipeline;
if(desc_sets!=ri->desc_sets)
return desc_sets-ri->desc_sets;
return render_obj-ri->render_obj;
}
CompOperator(const RenderableInstance *,Comp)
};//class RenderableInstance
VK_NAMESPACE_END
constexpr uint32_t VERTEX_COUNT=4;
vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl,const RectangleCreateInfo *rci) vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl,const RectangleCreateInfo *rci)
{ {
const vulkan::VertexShaderModule *vsm=mtl->GetVertexShaderModule(); const vulkan::VertexShaderModule *vsm=mtl->GetVertexShaderModule();
@ -40,10 +115,10 @@ vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl
if(vertex_binding!=-1) if(vertex_binding!=-1)
{ {
VB2f *vertex=new VB2f(6); VB2f *vertex=new VB2f(VERTEX_COUNT);
vertex->Begin(); vertex->Begin();
vertex->WriteRect(rci->scope); vertex->WriteRectFan(rci->scope);
vertex->End(); vertex->End();
render_obj->Set(vertex_binding,device->CreateVBO(vertex)); render_obj->Set(vertex_binding,device->CreateVBO(vertex));
@ -54,10 +129,10 @@ vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl
if(normal_binding!=-1) if(normal_binding!=-1)
{ {
VB3f *normal=new VB3f(6); VB3f *normal=new VB3f(VERTEX_COUNT);
normal->Begin(); normal->Begin();
normal->Write(rci->normal,6); normal->Write(rci->normal,VERTEX_COUNT);
normal->End(); normal->End();
render_obj->Set(normal_binding,device->CreateVBO(normal)); render_obj->Set(normal_binding,device->CreateVBO(normal));
@ -68,10 +143,10 @@ vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl
if(color_binding!=-1) if(color_binding!=-1)
{ {
VB4f *color=new VB4f(6); VB4f *color=new VB4f(VERTEX_COUNT);
color->Begin(); color->Begin();
color->Write(rci->color,6); color->Write(rci->color,VERTEX_COUNT);
color->End(); color->End();
render_obj->Set(color_binding,device->CreateVBO(color)); render_obj->Set(color_binding,device->CreateVBO(color));
@ -82,10 +157,10 @@ vulkan::Renderable *CreateRectangle(vulkan::Device *device,vulkan::Material *mtl
if(tex_coord_binding!=-1) if(tex_coord_binding!=-1)
{ {
VB2f *tex_coord=new VB2f(6); VB2f *tex_coord=new VB2f(VERTEX_COUNT);
tex_coord->Begin(); tex_coord->Begin();
tex_coord->WriteRect(rci->tex_coord); tex_coord->WriteRectFan(rci->tex_coord);
tex_coord->End(); tex_coord->End();
render_obj->Set(tex_coord_binding,device->CreateVBO(tex_coord)); render_obj->Set(tex_coord_binding,device->CreateVBO(tex_coord));
@ -186,7 +261,7 @@ private:
pipeline_creater->SetDepthTest(false); pipeline_creater->SetDepthTest(false);
pipeline_creater->SetDepthWrite(false); pipeline_creater->SetDepthWrite(false);
pipeline_creater->CloseCullFace(); pipeline_creater->CloseCullFace();
pipeline_creater->Set(PRIM_TRIANGLES); pipeline_creater->Set(PRIM_TRIANGLE_FAN);
pipeline=pipeline_creater->Create(); pipeline=pipeline_creater->Create();
@ -212,7 +287,7 @@ private:
cmd_buf[i]->Bind(pipeline); cmd_buf[i]->Bind(pipeline);
cmd_buf[i]->Bind(desciptor_sets); cmd_buf[i]->Bind(desciptor_sets);
cmd_buf[i]->Bind(render_obj); cmd_buf[i]->Bind(render_obj);
cmd_buf[i]->Draw(6); cmd_buf[i]->Draw(VERTEX_COUNT);
cmd_buf[i]->EndRenderPass(); cmd_buf[i]->EndRenderPass();
cmd_buf[i]->End(); cmd_buf[i]->End();
} }

View File

@ -348,6 +348,54 @@ namespace hgl
scope.GetRightBottom(), scope.GetRightBottom(),
scope.GetLeftBottom()); scope.GetLeftBottom());
} }
template<typename V>
bool WriteRectFan(const RectScope2<V> &scope)
{
if(!this->access||this->access+8>this->mem_end)
{
LOG_HINT(OS_TEXT("VertexBuffer2::WriteRectFan(RectScope2 *) out"));
return(false);
}
*this->access++=scope.GetLeft();
*this->access++=scope.GetTop();
*this->access++=scope.GetRight();
*this->access++=scope.GetTop();
*this->access++=scope.GetRight();
*this->access++=scope.GetBottom();
*this->access++=scope.GetLeft();
*this->access++=scope.GetBottom();
return(true);
}
template<typename V>
bool WriteRectTriangleStrip(const RectScope2<V> &scope)
{
if(!this->access||this->access+8>this->mem_end)
{
LOG_HINT(OS_TEXT("VertexBuffer2::WriteRectTriangleStrip(RectScope2 *) out"));
return(false);
}
*this->access++=scope.GetLeft();
*this->access++=scope.GetTop();
*this->access++=scope.GetLeft();
*this->access++=scope.GetBottom();
*this->access++=scope.GetRight();
*this->access++=scope.GetTop();
*this->access++=scope.GetRight();
*this->access++=scope.GetBottom();
return(true);
}
};//class VertexBuffer2 };//class VertexBuffer2
/** /**