CN108830920A - 一种创建常量缓冲区方法、装置及可读存储介质 - Google Patents
一种创建常量缓冲区方法、装置及可读存储介质 Download PDFInfo
- Publication number
- CN108830920A CN108830920A CN201810691127.0A CN201810691127A CN108830920A CN 108830920 A CN108830920 A CN 108830920A CN 201810691127 A CN201810691127 A CN 201810691127A CN 108830920 A CN108830920 A CN 108830920A
- Authority
- CN
- China
- Prior art keywords
- field
- interface
- constant
- buffer
- variable
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06T—IMAGE DATA PROCESSING OR GENERATION, IN GENERAL
- G06T15/00—3D [Three Dimensional] image rendering
- G06T15/005—General purpose rendering architectures
Landscapes
- Engineering & Computer Science (AREA)
- Computer Graphics (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Theoretical Computer Science (AREA)
- Image Generation (AREA)
Abstract
本发明提供了一种创建常量缓冲区方法、装置及可读存储介质。该方法包括:在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;编译HLSL脚本,获得类型为ID3DBlob的第一接口;创建像素着色器接口,将像素着色器接口保存在像素着色器类的m_shader字段中;基于第一接口得字节码以及字节码的字节长度,基于字节码与字节长度,调用返回方法,获得ID3D11ShaderReflection类型的第二接口;调用第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问第一结构的常量缓冲字段;基于常量缓冲字段,构建常量缓冲区数组,常量缓冲区数组中保存有与常量缓冲区数量一致的ID3D11Buffer接口。
Description
技术领域
本发明涉及电子技术领域,尤其涉及一种创建常量缓冲区方法、装置及可读存储介质。
背景技术
Direct3D(简称:D3D)是微软公司在Microsoft Windows操作系统上所开发的一套3D绘图编程接口。在Direct3D中的Direct3D11中,为了绘制图像,不仅需要编写C++代码,还需要编写高阶着色器语言HLSL(High Level Shader Language)着色器脚本。着色器脚本中,可以使用相关的常量缓冲区数据,用来在着色器中进行相关的数据操作。由于着色器函数中所需要的常量缓冲区数据是由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类型的第二接口;
第二调用单元,用于调用所述第二接口的获取描述信息方法,获得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软件平台,所述目标创建常量缓冲区装置包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现如前述第一方面实施例中所述的创建常量缓冲区方法的步骤。
第四方面,本发明实施例提供了一种可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现如前述第一方面实施例中所述的创建常量缓冲区方法的步骤。
本申请实施例中的上述一个或多个技术方案,至少具有如下一种或多种技术效果:
本发明实施例的技术方案,在Direct3D11中,首先,在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;然后编译HLSL脚本,获得类型为ID3DBlob的第一接口,第一接口中保存了编译后的HLSL脚本字节码;调用设备接口的创建像素着色器方法,创建像素着色器接口,将像素着色器接口保存在像素着色器类的m_shader字段中;调用第一接口的获取指定缓冲区内容方法,获得字节码,以及调用第一接口的获取指定缓冲区大小方法,获得字节码的字节长度,基于字节码与字节长度,调用Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;调用第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问第一结构的常量缓冲字段,确定HLSL脚本中所使用的常量缓冲区数量;最后,基于常量缓冲字段,构建常量缓冲区数组,常量缓冲区数组中保存有与常量缓冲区数量一致的ID3D11Buffer接口,每个ID3D11Buffer接口与HLSL脚本中所使用的每个常量缓冲区一一对应。这样,在C++代码中,能够在程序员未知HLSL脚本中使用哪些常量缓冲区cbuffer的情况下自动的获取到像素着色器函数中所使用到的所有常量缓冲区,并可自动建立其数量一致的ID3D11Buffer接口。像素着色器类能够针对任何HLSL脚本中的常量缓冲区使用,在不用更改C++代码的情况下,都能够正常的使用,极大的提高了C++代码的可通用性。
附图说明
图1为本发明第一实施例中的创建常量缓冲区方法的流程图;
图2为本发明第二实施例中的创建常量缓冲区装置的示意图;
图3为本发明第三实施例中创建常量缓冲区装置的示意图。
具体实施方式
本发明实施例提供了一种创建常量缓冲区方法、装置及可读存储介质,用于提供一种简单易行且准确创建常量缓冲区的方法,该方法应用于Direct3D11软件平台,包括:在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本字节码;调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的ID3D11Buffer接口。
下面通过附图以及具体实施例对本发明技术方案做详细的说明,应当理解本申请实施例以及实施例中的具体特征是对本申请技术方案的详细的说明,而不是对本申请技术方案的限定,在不冲突的情况下,本申请实施例以及实施例中的技术特征可以相互组合。
本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
实施例
请参考图1,本发明第一实施例提供一种创建常量缓冲区方法,应用于Direct3D11软件平台,该创建常量缓冲区方法包括如下步骤:
S101:在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;
S102:编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本字节码;
S103:调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;
S104:调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;
S105:调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;
S106:基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的ID3D11Buffer接口,每个所述ID3D11Buffer接口与所述HLSL脚本中所使用的每个常量缓冲区一一对应。
具体的,本实施例中创建常量缓冲区方法,可以应用于基于MicrosoftWindows操作系统的电子设备,例如智能手机、平板电脑之类的移动终端,还可以应用于台式计算机等设备,当然,还可以应用于其它电子设备,在此,本申请不做限制。电子设备安装有Microsoft Windows操作系统,该操作系统中安装Direct3D11软件。
首先,通过步骤S101,在像素着色器类D3D11PixelShader中,声明一个类型为ConstBufferDesc的结构体类型的常量缓冲区数组m_constBuffers,该数组中的每一项,记录了对应的常量缓冲区的相关信息。其中ConstBufferDesc结构体的定义如下:
在HLSL着色器代码中,以关键字cbuffer声明开头的数据被称为常量缓冲区,在C++代码用中ID3D11Buffer接口与HLSL脚本中的cbuffer相对应;并且ID3D11DeviceContext接口的UpdateSubreource方法,可以用来更新ID3D11Buffer接口中的数据,该接口的VSSetConstantBuffers方法,用于将ID3D11Buffer接口与顶点着色器中的cbuffer常量数据进行绑定,该接口的PSSetConstantBuffers方法,用于将ID3D11Buffer接口与像素着色器中的cbuffer常量数据进行绑定。
其中,ConstBufferDesc结构体的name字段,表示对应常量缓冲区cbuffer的结构名称,size字段表示该常量缓冲区cbuffer所占用的内存大小,buffer字段表示与常量缓冲区cbuffer相对应的ID3D11Buffer类型,bufferValue是一块大小为size的内存缓冲区,用来更新buffer接口的值,而vars字段是一个以字符串为键,以ConstBufferVarDesc结构为值的字典对象,该对象中存储了常量缓冲区cbuffer结构中所有的属性字段项,比如在ColorKeyColor中,colorKeyBuffer就是其一个属性,那么vars字段中,就会存在一个以colorKeyBuffer为键的字典项。
其中,ConstBufferVarDesc结构的定义如下:
其中name字段表示对应属性字段的名称,例如ColorKeyColor中的colorKeyBuffer,size字段表示该字段项的大小,例如colorKeyBuffer是float4类型,那么其大小就是16,offset字段表示该字段项相对于cbuffer结构开始处的偏移,例如colorKeyBuffer是ColorKeyColor的第一个成员,那么其offset值就是0。
然后,通过步骤S102,调用系统的D3D11Compile方法,将上述的HLSL脚本进行编译,从而获取到一个ID3DBlob的接口,该接口中保存了编译后的HLSL脚本字节码。
然后,通过步骤S103,调用ID3D11Device接口的CreatePixelShader方法,创建一个ID3D11PixelShader接口的像素着色器接口,并保存在D3D11PixelShader类的m_shader字段中。
然后,通过步骤S104,调用系统的返回方法D3DReflect方法,获取到一个ID3D11ShaderReflection接口,在调用该方法时,调用ID3D11Blob接口的GetBufferPointer方法获取编译后的脚本字节码,并将该字节码传入到D3DReflect函数的第一个参数中,调用ID3D11Blob接口的GetBufferSize方法,获取到字节码的长度大小,并将该值传入到D3DReflect函数的第二个参数中。在最终生成的ID3D11ShaderReflection的接口中,保存了所有与该HLSL脚本代码中相关的信息。
然后,通过步骤S105,根据步骤S104中获取到的ID3D11ShaderReflection接口,调用该接口的GetDesc方法,获取到一个D3D11_SHADER_DESC的结构,该结构中保存了所有对该HLSL脚本的描述信息。访问该结构中的ConstantBuffers字段,从而获取到该HLSL脚本中使用的常量缓冲区cbuffer的个数。
最后,通过步骤S106,基于常量缓冲字段,确定出与常量缓冲区数量一致的ID3D11Buffer接口,然后构建形成常量缓冲区数组m_constBuffers,m_constBuffers中保存有与常量缓冲区数量一致的ID3D11Buffer接口,每个ID3D11Buffer接口与HLSL脚本中所使用的每个常量缓冲区一一对应。
这样,在C++代码中,能够在程序员未知HLSL脚本中使用哪些个cbuffer的情况下自动的获取到像素着色器函数中所使用到的所有常量缓冲区,并可自动建立其数量一致的ID3D11Buffer接口。像素着色器类能够针对任何HLSL脚本中的常量缓冲区使用,在不用更改C++代码的情况下,都能够正常的使用,极大的提高了C++代码的可通用性。
具体的,所述常量缓冲字段的值为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结构体变量添加至所述常量缓冲区数组。
具体的,在本实施例中,如果ConstantBuffers字段的值为M,表明HLSL脚本中使用的常量缓冲区cbuffer的个数为M,构建的m_constBuffers结构数组包括M个类型为ConstBufferDesc的结构体。具体的,针对M个常量缓冲区中每个常量缓冲区,调用上述ID3D11ShaderReflection接口的按索引获得常量缓冲区方法GetConstantBufferByIndex,获取到常量缓冲区该常量缓冲区cbuffer的描述信息结构接口ID3D11ShaderReflectionConstantBuffer。然后,调用上述步骤中获得的ID3D11ShaderReflectionConstantBuffer接口的GetDesc方法,获得D3D11_SHADER_BUFFER_DESC结构。声明一个D3D11_BUFFER_DESC的结构变量bufferDesc,并该变量的BindFlags字段设置为D3D11_BIND_CONSTANT_BUFFER,将ByteWidth字段设置为前述步骤获得的D3D11_SHADER_BUFFER_DESC结构中的Size字段(表示该常量缓冲区cbuffer的字节大小),然后调用ID3D11Device接口的CreateBuffer方法,将bufferDesc变量传入到该方法的第一个参数中,从而获得ID3D11Buffer接口。
最后,创建一个ConstBufferDesc结构体变量,并将上述创建的ID3D11Buffer接口赋值给该变量的buffer字段,将上述中D3D11_SHADER_BUFFER_DESC结构的Name字段赋值给该结构体的name字段(表示常量缓冲区cbuffer的名称),将D3D11_SHADER_BUFFER_DESC的Size字段赋值给该结构体的size字段(表示常量缓冲区cbuffer的字节大小),然后通过new操作符创建size大小的内存缓冲区并赋值给该结构的bufferValue字段。这样,即可构建的m_constBuffers结构数组包括M个类型为ConstBufferDesc的结构体。
进一步,针对所述M个常量缓冲区中每个常量缓冲区,获取该常量缓冲区的Variables字段,所述Variables字段的值为N,确定常量缓冲区中包括N个属性字段,针对每个属性字段,调用ID3D11ShaderReflectionConstantBuffer接口的按索引获得变量的方法,获取该属性字段对应的ID3D11ShaderReflectionVariable接口;
调用所述ID3D11ShaderReflectionVariable接口的获得描述信息方法,获得该属性字段对应的描述结构;
创建ConstBufferVarDesc变量,将所述描述结构的Name字段赋值给所述ConstBufferVarDesc变量的name字段,将所述描述结构的Size赋值给所述ConstBufferVarDesc变量的size字段,将所述描述结构的StartOffset字段赋值给所述ConstBufferVarDesc变量的offset字段,将ConstBufferVarDesc结构以键值对的方式存储到ConstBufferDesc结构体变量的vars字段中。
具体的,在本实施例中,一个常量缓冲区cbuffer中可能包含多个属性字段,如果针对某个常量缓冲区cbuffer,通过访问该常量缓冲区cbuffer的D3D11_SHADER_BUFFER_DESC结构的Variables字段,可以获取到常量缓冲区cbuffer中的所有属性字段。如果Variables字段的值为N,表明该常量缓冲区cbuffer存在N个属性字段,针对该常量缓冲区cbuffer的每个属性字段,调用ID3D11ShaderReflectionConstantBuffer接口的按索引获得变量方法GetVariableByIndex,获取该字段对应的ID3D11ShaderReflectionVariable接口。
调用该ID3D11ShaderReflectionVariable接口的获得描述信息方法GetDesc,获得对该字段的描述结构D3D11_SHADER_VARIABLE_DESC。
最后,创建一个ConstBufferVarDesc的变量,将描述结构D3D11_SHADER_VARIABLE_DESC中的Name(表示该常量缓冲区cbuffer中的该属性字段名称)字段赋值给ConstBufferVarDesc的name字段,将D3D11_SHADER_VARIABLE_DESC结构的Size(表示该常量缓冲区cbuffer中的该属性字段的大小)复制给ConstBufferVarDesc的size字段,将D3D11_SHADER_VARIABLE_DESC结构的StartOffset字段(表示该常量缓冲区cbuffer结构中该属性字段位于常量缓冲区cbuffer开始的偏移值)赋值给ConstBufferVarDesc的offset字段。最后,将ConstBufferVarDesc结构以键值对的方式存储到ConstBufferDesc结构的vars字段中。
通过上面的步骤,已经获取到一个cbuffer中的所有信息,并且将这些信息已经全部保存在ConstBufferDesc结构体变量中,最终将该结构体变量添加到m_constBuffers数组中保存。由此,自动创建与cbuffer个数相匹配的ID3D11Buffer接口。能够在程序员未知HLSL脚本中使用哪些个cbuffer的情况下自动的获取到像素着色器函数中所使用到的所有cbuffer常量缓冲区,这样能够有效解决在C++代码中必须手动的创建与HLSL脚本中相同个数ID3D11Buffer的弊端。
进一步,在本实施例中,还提供根据常量缓冲区cbuffer中的字段名称,设置ID3D11Buffer的值的设置常量缓冲区属性字段方法,具体实现包括如下步骤:
如果检测到调用设置常量缓冲区属性字段方法,确定传入所述调用设置常量缓冲区属性字段方法的待设置属性字段的待设置名称以及待设置值,所述待设置值用于将所述待设置属性字段的缓存设置为所述待设置值;
基于所述待设置名称,从所述常量缓冲区数组中获得与之对应的第一ConstBufferDesc结构体变量;
将所述待设置值拷贝至所述第一ConstBufferDesc结构体变量中的bufferValue字段的指定偏移处;
将所述bufferValue字段中的值更新到所述第一ConstBufferDesc结构体变量对应的第一ID3D11Buffer接口中。
具体的,在本实施例中,设置常量缓冲区属性字段方法setValue的函数原型如下:
setValue(const char*name,void*value,int size)
由此可以看出,该函数接收三个参数,第一个参数name表示要设置的常量缓冲区cbuffer中的与该名称对应的某个字段,value表示设置的值,size表示value的字节大小数。比如要设置AlphaBlendColor cbuffer结构中的AlphaBlendBuffer字段,调用代码etValue(“alphaBlendBuffer”,RGBA(1,0,0,1),16)即可完成。那么该函数的实现过程如下:
首先,针对m_constBuffers数组中的每一个ConstBufferDesc结构,在该结构的vars字段保存的键值对字典中进行查找,如果找到了与name参数相匹配的ConstBufferVarDesc,则将参数value的值拷贝到bufferValue字段的指定偏移处,其中偏移值为ConstBufferVarDesc结构中的offset值,即执行代码:Memcpy(bufferValue+ConstBufferVarDesc.offset,value,size),从而完成对bufferValue内存的更新。最后,通过上面的步骤,ConstBufferDesc结构中的bufferValue已经保存了最新的常量数据值,此时需要将bufferValue字段中的值更新到ID3D11Buffer接口中,即调用ID3D11DeviceContext接口的UpdateSubresource方法,将ConstBufferDesc结构中的类型为ID3D11Buffer的buffer字段传递到该方法的第一个参数中,将bufferValue传入到该方法的第四个参数中,其余4个参数均设置为0即可。
所以,本实施例中的方法,还能够在提供的setValue方法中根据HLSL中cbuffer结构中的字段名称,去设置常量缓冲区的数值,更加灵活高效正确的设置常量缓冲区的值。
进一步,在本实施例中,还提供自动设置每个ID3D11Buffer所需要的常量寄存器索引的设置着色器方法,具体实现如下:
如果检测到调用设置着色器方法,基于所述m_shader字段,调用ID3D11DeviceContext接口的PSSetShader方法;
针对所述常量缓冲区数组中每个ConstBufferDesc结构体变量,调用ID3D11DeviceContext接口的PSSetConstantBuffers方法,将该ConstBufferDesc结构体变量对应的常量缓冲区与ID3D11Buffer接口绑定。
具体的,设置着色器方法的函数原型如下:
void setShader()
由此可以看出,该方法不带任何参数,使用非常简单。其实现过程如下:
首先,调用ID3D11DeviceContext接口的PSSetShader方法,将m_shader字段设置到该方法的第一个参数中,其余两个参数均设置为0。然后,完成所有ID3D11Buffer与cbuffer的绑定操作,此步骤完成ID3D11Buffer接口所需要的常量寄存器索引,从而与HLSL脚本中的cbuffer结构完成绑定。具体的,针对m_constBuffers数组中的每一个ConstBufferDesc结构,对第i(i大于等于0,小于m_constBuffers数组的大小)个ConstBufferDesc结构调用ID3D11DeviceContext接口的PSSetConstantBuffers方法,将i传入到该方法的第一个参数中,将数字1传入到该方法的第二个参数汇总,将ConstBufferDesc中的buffer(类型为ID3D11Buffer)字段传入到该方法的第三个参数中。此步完成之后,便完成了D3D11PixelShader类中所有ID3D11Buffer接口与HLSL脚本中cbuffer常量缓冲区的绑定操作。并且能够自动的获取到HLSL脚本中每个cbuffer所使用的常量寄存器索引,避免传统方法中C++代码采用硬编码常量寄存器索引的弊端
在本实施例中,D3D11PixelShader类提供了三个方法,分别为compile(编译HLSL脚本,实现在程序员未知HLSL脚本中使用哪些个cbuffer的情况下自动的获取到像素着色器函数中所使用到的所有常量缓冲区,并可自动建立其数量一致的ID3D11Buffer接口。setValue,根据HLSL中cbuffer的名称,设置ID3D11Buffer的值,完成上述的目的。setShader,将ID3D11Buffer与cbuffer完成绑定操作。
下面以一个完整示例进行详细说明,在下面这个例子中,有一个D3D11RenderSystem的类,以及一个简单的像素着色器代码,在该像素着色器代码中使用到了两个cbuffer常量数据,一个是colorKeyBuffer,一个是alphaBlendBuffer。那么传统方法中,所实现的步骤应该是下面这样的:
而在D3D11RenderSystem类中,也必须创建两个ID3D11Buffer与之相对应,即C++代码如下
这样的话,就能够保持与HLSL脚本中所使用的cbuffer保持一致。并且D3D11RenderSystem的setColor方法中完成将ID3D11Buffer与cbuffer的绑定操作(将HLSL中的colorKeyBuffer颜色设置为黑色,将alphaBlendBuffer颜色设置为红色)。
在调用PSSetConstantBuffers方法时,设置m_alphaBlendBuffer时,使用的常量索引寄存器是0,而在设置m_colorKeyBuffer时,所使用的常量索引寄存器是1。因为上述中在HLSL脚本中,alphaBlendBuffer的声明是在colorKeyBuffer之前的,索引按照HLSL中的规则,在前面声明的cbuffer,其所使用的常量寄存器索引的值就在前面。
但是,如果将HLSL中两个cbuffer的声明调换先后顺序,变成下面这样:
那么,D3D11RenderSystem中的setColor方法,如果不做出相应的更改的话,m_alphaBlendBuffer就会绑定到HLSL中的colorKeyBuffer上,m_colorKeyBuffer就会绑定到HLSL中的alphaBlendBuffer上。从而导致最终显示不正确。所以,这种做法既不能保证C++代码的可通用性,即不管HLSL脚本代码中如何使用cbuffer常量缓冲区,C++代码都能够正确的创建出与之相对应的ID3D11Buffer接口。并且当在HLSL脚本代码做出更改之后,如果C++代码没有做出相应的更改,那么最终可能无法正确的运行。
如果将上述D3D11RenderSysem改成本实施例中的实现方式,就可以完美解决传统方法的弊端。
通过本实施例中的方法,使得D3D11PixelShader类能够针对任何HLSL脚本中的常量缓冲区使用,在不用更改C++代码的情况下,都能够正常的使用,极大的提高了C++代码的可冲用下,使得其与HLSL脚本代码之间不再耦合。
请参见图2,本发明的第二实施例提供了一种创建常量缓冲区装置,应用于Direct3D11软件平台,包括:
声明单元201,用于在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;
编译单元202,用于编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本字节码;
第一创建单元203,用于调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;
第一调用单元204,用于调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;
第二调用单元205,用于调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;
第二创建单元206,用于基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的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接口绑定。
请参见图3,本发明的第三实施例提供了一种创建常量缓冲区装置,该实施例的装置包括:处理器301、存储器302以及存储在所述存储器中并可在所述处理器上运行的计算机程序,例如第一实施例中创建常量缓冲区方法对应的程序。所述处理器执行所述计算机程序时实现上述第一实施例中各路径检测中的步骤。或者,所述处理器执行所述计算机程序时实现上述第二实施例的装置中各模块/单元的功能。
示例性的,所述计算机程序可以被分割成一个或多个模块/单元,所述一个或者多个模块/单元被存储在所述存储器中,并由所述处理器执行,以完成本发明。所述一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述所述计算机程序在所述计算机装置中的执行过程。例如,所述计算机程序可以被分割成声明单元、编译单元、第一创建单元、第二调用单元、第二创建单元的功能,各单元具体功能如下:
声明单元,用于在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;
编译单元,用于编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本字节码;
第一创建单元,用于调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;
第一调用单元,用于调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;
第二调用单元,用于调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;
第二创建单元,用于基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的ID3D11Buffer接口,每个所述ID3D11Buffer接口与所述HLSL脚本中所使用的每个常量缓冲区一一对应。
所述装置可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,所述示意图3仅仅是计算机装置的示例,并不构成对装置的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如所述装置还可以包括输入输出设备、网络接入设备、总线等。
所称处理器301可以是中央处理单元(Central Processing Unit,CPU),还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等,所述处理器是所述计算机装置的控制中心,利用各种接口和线路连接整个计算机装置的各个部分。
所述存储器302可用于存储所述计算机程序和/或模块,所述处理器通过运行或执行存储在所述存储器内的计算机程序和/或模块,以及调用存储在存储器内的数据,实现所述计算机装置的各种功能。所述存储器可主要包括存储程序区和存储数据区,其中,存储程序区可存储操作系统、至少一个功能所需的应用程序(比如声音播放功能、图像播放功能等)等;存储数据区可存储根据手机的使用所创建的数据(比如音频数据、视频数据等)等。此外,存储器可以包括高速随机存取存储器,还可以包括非易失性存储器,例如硬盘、内存、插接式硬盘,智能存储卡(Smart Media Card,SMC),安全数字(SecureDigital,SD)卡,闪存卡(Flash Card)、至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
进一步,该装置所包括的处理器301还具有以下功能:
所述常量缓冲字段的值为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结构体变量添加至所述常量缓冲区数组。
进一步,该装置所包括的处理器301还具有以下功能:
针对所述M个常量缓冲区中每个常量缓冲区,获取该常量缓冲区的Variables字段,所述Variables字段的值为N,确定常量缓冲区中包括N个属性字段,针对每个属性字段,调用ID3D11ShaderReflectionConstantBuffer接口的按索引获得变量的方法,获取该属性字段对应的ID3D11ShaderReflectionVariable接口;
调用所述ID3D11ShaderReflectionVariable接口的获得描述信息方法,获得该属性字段对应的描述结构;
创建ConstBufferVarDesc变量,将所述描述结构的Name字段赋值给所述ConstBufferVarDesc变量的name字段,将所述描述结构的Size赋值给所述ConstBufferVarDesc变量的size字段,将所述描述结构的StartOffset字段赋值给所述ConstBufferVarDesc变量的offset字段,将ConstBufferVarDesc结构以键值对的方式存储到ConstBufferDesc结构体变量的vars字段中。
进一步,该装置所包括的处理器301还具有以下功能:
如果检测到调用设置常量缓冲区属性字段方法,确定传入所述调用设置常量缓冲区属性字段方法的待设置属性字段的待设置名称以及待设置值,所述待设置值用于将所述待设置属性字段的缓存设置为所述待设置值;
基于所述待设置名称,从所述常量缓冲区数组中获得与之对应的第一ConstBufferDesc结构体变量;
将所述待设置值拷贝至所述第一ConstBufferDesc结构体变量中的bufferValue字段的指定偏移处;
将所述bufferValue字段中的值更新到所述第一ConstBufferDesc结构体变量对应的第一ID3D11Buffer接口中。
进一步,该装置所包括的处理器301还具有以下功能:
如果检测到调用设置着色器方法,基于所述m_shader字段,调用ID3D11DeviceContext接口的PSSetShader方法;
针对所述常量缓冲区数组中每个ConstBufferDesc结构体变量,调用ID3D11DeviceContext接口的PSSetConstantBuffers方法,将该ConstBufferDesc结构体变量对应的常量缓冲区与ID3D11Buffer接口绑定。
本发明第四实施例提供了一种计算机可读存储介质,其上存储有计算机程序,本发明第二实施例中的所述创建常量缓冲区装置集成的功能单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述第一实施例的创建常量缓冲区方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。
Claims (10)
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字段,调用ID3D11DeviceContext接口的PSSetShader方法;
针对所述常量缓冲区数组中每个ConstBufferDesc结构体变量,调用ID3D11DeviceContext接口的PSSetConstantBuffers方法,将该ConstBufferDesc结构体变量对应的常量缓冲区与ID3D11Buffer接口绑定。
6.一种创建常量缓冲区装置,应用于Direct3D11软件平台,其特征在于,包括:
声明单元,用于在像素着色器类中声明类型为ConstBufferDesc的结构体类型的常量缓冲区数组;
编译单元,用于编译HLSL脚本,获得类型为ID3DBlob的第一接口,所述第一接口中保存了编译后的HLSL脚本字节码;
第一创建单元,用于调用设备接口的创建像素着色器方法,创建像素着色器接口,将所述像素着色器接口保存在所述像素着色器类的m_shader字段中;
第一调用单元,用于调用所述第一接口的获取指定缓冲区内容方法,获得所述字节码,以及调用所述第一接口的获取指定缓冲区大小方法,获得所述字节码的字节长度,基于所述字节码与所述字节长度,调用所述Direct3D11软件平台的返回方法,获得ID3D11ShaderReflection类型的第二接口;
第二调用单元,用于调用所述第二接口的获取描述信息方法,获得D3D11_SHADER_DESC类型的第一结构,访问所述第一结构的常量缓冲字段,确定所述HLSL脚本中所使用的常量缓冲区数量;
第二创建单元,用于基于所述常量缓冲字段,构建所述常量缓冲区数组,所述常量缓冲区数组中保存有与所述常量缓冲区数量一致的ID3D11Buffer接口,每个所述ID3D11Buffer接口与所述HLSL脚本中所使用的每个常量缓冲区一一对应。
7.如权利要求6所述的装置,其特征在于,所述第二创建单元具体用于:
所述常量缓冲字段的值为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结构体变量添加至所述常量缓冲区数组。
8.如权利要求7所述的装置,其特征在于,所述第二创建单元还用于:针对所述M个常量缓冲区中每个常量缓冲区,获取该常量缓冲区的Variables字段,所述Variables字段的值为N,确定常量缓冲区中包括N个属性字段,针对每个属性字段,调用ID3D11ShaderReflectionConstantBuffer接口的按索引获得变量的方法,获取该属性字段对应的ID3D11ShaderReflectionVariable接口;
调用所述ID3D11ShaderReflectionVariable接口的获得描述信息方法,获得该属性字段对应的描述结构;
创建ConstBufferVarDesc变量,将所述描述结构的Name字段赋值给所述ConstBufferVarDesc变量的name字段,将所述描述结构的Size赋值给所述ConstBufferVarDesc变量的size字段,将所述描述结构的StartOffset字段赋值给所述ConstBufferVarDesc变量的offset字段,将ConstBufferVarDesc结构以键值对的方式存储到ConstBufferDesc结构体变量的vars字段中。
9.一种创建常量缓冲区装置,应用于Direct3D11软件平台,其特征在于,所述目标创建常量缓冲区装置包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现如权利要求1-5中任一项所述的创建常量缓冲区方法的步骤。
10.一种可读存储介质,其上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1-5中任一项所述的创建常量缓冲区方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810691127.0A CN108830920B (zh) | 2018-06-28 | 2018-06-28 | 一种创建常量缓冲区方法、装置及可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810691127.0A CN108830920B (zh) | 2018-06-28 | 2018-06-28 | 一种创建常量缓冲区方法、装置及可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108830920A true CN108830920A (zh) | 2018-11-16 |
CN108830920B CN108830920B (zh) | 2022-06-21 |
Family
ID=64134990
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810691127.0A Active CN108830920B (zh) | 2018-06-28 | 2018-06-28 | 一种创建常量缓冲区方法、装置及可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108830920B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113421337A (zh) * | 2021-07-21 | 2021-09-21 | 北京臻观数智科技有限公司 | 一种提升模型渲染效率的方法 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6772413B2 (en) * | 1999-12-21 | 2004-08-03 | Datapower Technology, Inc. | Method and apparatus of data exchange using runtime code generator and translator |
CN102077251A (zh) * | 2008-06-27 | 2011-05-25 | 微软公司 | 着色器接口 |
US20140043342A1 (en) * | 2012-08-09 | 2014-02-13 | Qualcomm Incorporated | Extending dx11 gpu for programmable vector graphics |
CN106528096A (zh) * | 2016-10-20 | 2017-03-22 | 武汉斗鱼网络科技有限公司 | 一种在d3d12全屏游戏源上绘制弹幕图像的方法及系统 |
CN107077833A (zh) * | 2014-11-20 | 2017-08-18 | 英特尔公司 | 用于最后排序架构的高效的帧到帧相干性利用的装置和方法 |
US20170345208A1 (en) * | 2011-04-14 | 2017-11-30 | Suntracker Technologies Ltd. | System and method for real time dynamic lighting simulation |
-
2018
- 2018-06-28 CN CN201810691127.0A patent/CN108830920B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6772413B2 (en) * | 1999-12-21 | 2004-08-03 | Datapower Technology, Inc. | Method and apparatus of data exchange using runtime code generator and translator |
CN102077251A (zh) * | 2008-06-27 | 2011-05-25 | 微软公司 | 着色器接口 |
US20170345208A1 (en) * | 2011-04-14 | 2017-11-30 | Suntracker Technologies Ltd. | System and method for real time dynamic lighting simulation |
US20140043342A1 (en) * | 2012-08-09 | 2014-02-13 | Qualcomm Incorporated | Extending dx11 gpu for programmable vector graphics |
CN107077833A (zh) * | 2014-11-20 | 2017-08-18 | 英特尔公司 | 用于最后排序架构的高效的帧到帧相干性利用的装置和方法 |
CN106528096A (zh) * | 2016-10-20 | 2017-03-22 | 武汉斗鱼网络科技有限公司 | 一种在d3d12全屏游戏源上绘制弹幕图像的方法及系统 |
Non-Patent Citations (1)
Title |
---|
ZSDNR: "DirectX11中Shader的封装", 《HTTPS://BLOG.51CTO.COM/U_12942149/1929385》 * |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113421337A (zh) * | 2021-07-21 | 2021-09-21 | 北京臻观数智科技有限公司 | 一种提升模型渲染效率的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN108830920B (zh) | 2022-06-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109976761B (zh) | 软件开发工具包的生成方法、装置及终端设备 | |
CN110221968A (zh) | 软件测试方法及相关产品 | |
JP2002527815A (ja) | プログラムコード変換方法 | |
Kessenich et al. | Spir-v specification | |
CN110032562B (zh) | 一种存储业务记录的方法及装置 | |
CN112463139B (zh) | 基于电子积木的编程方法、装置、电子设备及存储介质 | |
CN116028022A (zh) | 一种基于Java技术的零代码Excel数据导入方法、装置及介质 | |
CN111262753A (zh) | 一种numa节点个数自动配置方法方法、系统、终端及存储介质 | |
CN108345458B (zh) | 一种静态编译语言与脚本语言的调用方法及系统 | |
CN108922607A (zh) | 服务器、数据处理的方法及存储介质 | |
CN108830920A (zh) | 一种创建常量缓冲区方法、装置及可读存储介质 | |
CN111385661B (zh) | 语音控制全屏播放的方法、装置、终端及存储介质 | |
CN117215497A (zh) | 一种基于二维id寻址的数据存储方法、系统、设备及介质 | |
CN117234517A (zh) | 接口参数校验方法、装置、设备及存储介质 | |
Rusch et al. | Introduction to vulkan ray tracing | |
CN115809290A (zh) | 生成数据持久层入参方法、装置、设备及介质 | |
CN108845961A (zh) | 一种创建顶点缓冲区方法、装置及可读存储介质 | |
CN105677968B (zh) | 可编程逻辑器件电路图绘制方法及装置 | |
CN111581578B (zh) | 接口请求处理方法和装置 | |
CN112463202B (zh) | 操作系统功能组件的配置方法及装置 | |
Marner | Evaluating Java for game development | |
CN114254068A (zh) | 一种数据流转方法和系统 | |
CN115167862A (zh) | 补丁方法及相关设备 | |
CN108958718B (zh) | 一种纹理图像绑定方法、装置及可读存储介质 | |
CN116804915B (zh) | 基于存储器的数据交互方法、处理器、设备以及介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |