一种创建常量缓冲区方法、装置及可读存储介质制造方法及图纸

技术编号:19482268 阅读:42 留言:0更新日期:2018-11-17 10:48
本发明专利技术提供了一种创建常量缓冲区方法、装置及可读存储介质。该方法包括:在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;编译HLSL脚本,获得类型为ID3DBlob的第一接口;创建像素着色器接口,将像素着色器接口保存在像素着色器类的m_shader字段中;基于第一接口得字节码以及字节码的字节长度,基于字节码与字节长度,调用返回方法,获得ID3D11ShaderReflection类型的第二接口;调用第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问第一结构的常量缓冲字段;基于常量缓冲字段,构建常量缓冲区数组,常量缓冲区数组中保存有与常量缓冲区数量一致的ID3D11Buffer接口。

【技术实现步骤摘要】
一种创建常量缓冲区方法、装置及可读存储介质
本专利技术涉及电子
,尤其涉及一种创建常量缓冲区方法、装置及可读存储介质。
技术介绍
Direct3D(简称:D3D)是微软公司在MicrosoftWindows操作系统上所开发的一套3D绘图编程接口。在Direct3D中的Direct3D11中,为了绘制图像,不仅需要编写C++代码,还需要编写高阶着色器语言HLSL(HighLevelShaderLanguage)着色器脚本。着色器脚本中,可以使用相关的常量缓冲区数据,用来在着色器中进行相关的数据操作。由于着色器函数中所需要的常量缓冲区数据是由C++代码传递过来的,要求编写的C++代码必须与HLSL着色器代码保持一致,才能在C++代码中正确的设置HLSL着色器代码中所需要的常量缓冲区数据,导致C++代码的可通用性差且创建常量缓冲区容易出现异常。
技术实现思路
本专利技术实施例提供了一种创建常量缓冲区方法、装置及可读存储介质,用于提供一种简单易行且准确创建常量缓冲区的方法。第一方面,本专利技术实施例提供了一种创建常量缓冲区方法,应用于Direct3D11软件平台,包括:在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本字节码;调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的ID3D11Buffer接口,每个所述ID3D11Buffer接口与所述HLSL脚本中所使用的每个常量缓冲区一一对应。可选的,所述基于所述常量缓冲字段,构建所述常量缓冲区数组,包括:所述常量缓冲字段的值为M,确定所述HLSL脚本中所使用的M个常量缓冲区,针对所述M个常量缓冲区中每个常量缓冲区,调用所述第二接口的按索引获得常量缓冲区方法,获得该常量缓冲区对应的描述信息结构接口;基于所述描述信息结构接口,获得D3D11_SHADER_BUFFER_DESC类型的第二结构,声明D3D11_BUFFER_DESC的结构变量bufferDesc,将所述bufferDesc变量的BindFlags字段与ByteWidth字段分别设置为D3D11_BIND_CONSTANT_BUFFER以及所述第二结构中的Size字段,基于设置后的bufferDesc变量,调用所述设备接口的创建缓存方法,创建获得ID3D11Buffer接口;创建ConstBufferDesc结构体变量,将所述ID3D11Buffer接口赋值给所述ConstBufferDesc结构体变量的buffer字段,将所述第二结构的Name字段赋值给所述ConstBufferDesc结构体变量的name字段,将所述第二结构的Size字段赋值给所述ConstBufferDesc结构体变量的size字段,通过new操作符创建所述ConstBufferDesc结构体变量中的size字段指示大小的内存缓冲区,并基于所述ConstBufferDesc结构体变量的size字段,赋值所述ConstBufferDesc结构体变量的bufferValue字段,将ConstBufferDesc结构体变量添加至所述常量缓冲区数组。可选的,所述方法还包括:针对所述M个常量缓冲区中每个常量缓冲区,获取该常量缓冲区的Variables字段,所述Variables字段的值为N,确定常量缓冲区中包括N个属性字段,针对每个属性字段,调用ID3D11ShaderReflectionConstantBuffer接口的按索引获得变量的方法,获取该属性字段对应的ID3D11ShaderReflectionVariable接口;调用所述ID3D11ShaderReflectionVariable接口的获得描述信息方法,获得该属性字段对应的描述结构;创建ConstBufferVarDesc变量,将所述描述结构的Name字段赋值给所述ConstBufferVarDesc变量的name字段,将所述描述结构的Size赋值给所述ConstBufferVarDesc变量的size字段,将所述描述结构的StartOffset字段赋值给所述ConstBufferVarDesc变量的offset字段,将ConstBufferVarDesc结构以键值对的方式存储到ConstBufferDesc结构体变量的vars字段中。可选的,所述方法还包括:如果检测到调用设置常量缓冲区属性字段方法,确定传入所述调用设置常量缓冲区属性字段方法的待设置属性字段的待设置名称以及待设置值,所述待设置值用于将所述待设置属性字段的缓存设置为所述待设置值;基于所述待设置名称,从所述常量缓冲区数组中获得与之对应的第一ConstBufferDesc结构体变量;将所述待设置值拷贝至所述第一ConstBufferDesc结构体变量中的bufferValue字段的指定偏移处;将所述bufferValue字段中的值更新到所述第一ConstBufferDesc结构体变量对应的第一ID3D11Buffer接口中。可选的,所述方法还包括:如果检测到调用设置着色器方法,基于所述m_shader字段,调用ID3D11DeviceContext接口的PSSetShader方法;针对所述常量缓冲区数组中每个ConstBufferDesc结构体变量,调用ID3D11DeviceContext接口的PSSetConstantBuffers方法,将该ConstBufferDesc结构体变量对应的常量缓冲区与ID3D11Buffer接口绑定。第二方面,本专利技术实施例提供一种创建常量缓冲区装置,应用于Direct3D11软件平台,包括:声明单元,用于在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;编译单元,用于编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本字节码;第一创建单元,用于调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;第一调用单元,用于调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;第二调用单元,用于调本文档来自技高网...

【技术保护点】
1.一种创建常量缓冲区方法,应用于Direct3D11软件平台,其特征在于,包括:在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本的字节码;调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的ID3D11Buffer接口,每个所述ID3D11Buffer接口与所述HLSL脚本中所使用的每个常量缓冲区一一对应。...

【技术特征摘要】
1.一种创建常量缓冲区方法,应用于Direct3D11软件平台,其特征在于,包括:在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本的字节码;调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的ID3D11Buffer接口,每个所述ID3D11Buffer接口与所述HLSL脚本中所使用的每个常量缓冲区一一对应。2.如权利要求1所述的方法,其特征在于,所述基于所述常量缓冲字段,构建所述常量缓冲区数组,包括:所述常量缓冲字段的值为M,确定所述HLSL脚本中所使用的M个常量缓冲区,针对所述M个常量缓冲区中每个常量缓冲区,调用所述第二接口的按索引获得常量缓冲区方法,获得该常量缓冲区对应的描述信息结构接口;基于所述描述信息结构接口,获得D3D11_SHADER_BUFFER_DESC类型的第二结构,声明D3D11_BUFFER_DESC的结构变量bufferDesc,将所述bufferDesc变量的BindFlags字段与ByteWidth字段分别设置为D3D11_BIND_CONSTANT_BUFFER以及所述第二结构中的Size字段,基于设置后的bufferDesc变量,调用所述设备接口的创建缓存方法,创建获得ID3D11Buffer接口;创建ConstBufferDesc结构体变量,将所述ID3D11Buffer接口赋值给所述ConstBufferDesc结构体变量的buffer字段,将所述第二结构的Name字段赋值给所述ConstBufferDesc结构体变量的name字段,将所述第二结构的Size字段赋值给所述ConstBufferDesc结构体变量的size字段,通过new操作符创建所述ConstBufferDesc结构体变量中的size字段指示大小的内存缓冲区,并基于所述ConstBufferDesc结构体变量的size字段,赋值所述ConstBufferDesc结构体变量的bufferValue字段,将ConstBufferDesc结构体变量添加至所述常量缓冲区数组。3.如权利要求2所述的方法,其特征在于,所述方法还包括:针对所述M个常量缓冲区中每个常量缓冲区,获取该常量缓冲区的Variables字段,所述Variables字段的值为N,确定常量缓冲区中包括N个属性字段,针对每个属性字段,调用ID3D11ShaderReflectionConstantBuffer接口的按索引获得变量的方法,获取该属性字段对应的ID3D11ShaderReflectionVariable接口;调用所述ID3D11ShaderReflectionVariable接口的获得描述信息方法,获得该属性字段对应的描述结构;创建ConstBufferVarDesc变量,将所述描述结构的Name字段赋值给所述ConstBufferVarDesc变量的name字段,将所述描述结构的Size赋值给所述ConstBufferVarDesc变量的size字段,将所述描述结构的StartOffset字段赋值给所述ConstBufferVarDesc变量的offset字段,将ConstBufferVarDesc结构以键值对的方式存储到ConstBufferDesc结构体变量的vars字段中。4.如权利要求3所述的方法,其特征在于,所述方法还包括:如果检测到调用设置常量缓冲区属性字段方法,确定传入所述调用设置常量缓冲区属性字段方法的待设置属性字段的待设置名称以及待设置值,所述待设置值用于将所述待设置属性字段的缓存设置为所述待设置值;基于所述待设置名称,从所述常量缓冲区数组中获得与之对应的第一ConstBufferDesc结构体变量;将所述待设置值拷贝至所述第一ConstBufferDesc结构体变量中的bufferValue字段的指定偏移处;将所述bufferValue字段中的值更新到所述第一ConstBufferDesc结构体变量对应的第一ID3D11Buffer接口中。5.如权利要求3所述的方法,其特征在于,所述方法还包括:如果检测到调用设置着色器方法,基于所述m_shader字段,调用ID3D11DeviceCon...

【专利技术属性】
技术研发人员:杨亮陈少杰张文明
申请(专利权)人:武汉斗鱼网络科技有限公司
类型:发明
国别省市:湖北,42

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1