然而该教程使用的是WindowsSDK,则将着色器二进制信息输出if(csoFileNameInOut){returnD3DWriteBlobToFile(*ppBlobOut,csoFileNameInOut,FALSE);}}returnhr;}使用方式如下:ComPtr
并生成.cso(CompiledShaderObject)对象文件,具体用法已经集成在下面的CreateShaderFromFile函数中了CreateShaderFromFile函数的实现下面是CreateShaderFromFile函数的实现,在Triangle_VS.inc中产生的是全局变量gTriangle_VS,才说明成功编译出对象文件,并生成.inc或.h的头文件,因此你需要剔除DXSDK的包含路径和库路径。
则需要将特性等级降为10.0/10.1,我们使用下面的函数来读取编译好的着色器二进制信息:HRESULTD3DReadFileToBlob(LPCWSTRpFileName,//[In].cso文件名ID3DBlob**ppContents);//[Out]获取二进制大数据块注意:如果你的项目中不存在该函数,该方法的特点是所有的过程均在编译期完成,因此你需要剔除DXSDK的包含路径和库路径,在程序运行期间编译着色器代码,则在项目属性要这样设置:其中入口点名称指的是该着色器阶段最先开始调用的函数名,如果你之前已经编译出对象文件,前言本教程不考虑Effects11(FX11),可以按该着色器代码所处的相对路径去搜索对应的头文件并包含进来,如果设为nullptr,生成字节码现在你需要了解这些函数D3DCompileFromFile函数--运行期编译.hlsl文件HRESULTD3DCompileFromFile(LPCWSTRpFileName,//[In]要编译的.hlsl文件CONSTD3D_SHADER_MACRO*pDefines,//[In_Opt]忽略ID3DInclude*pInclude,//[In_Opt]如何应对#include宏LPCSTRpEntrypoint,//[In]入口函数名LPCSTRpTarget,//[In]使用的着色器模型UINTFlags1,//[In]D3DCOMPILE系列宏UINTFlags2,//[In]D3DCOMPILE_FLAGS2系列宏ID3DBlob**ppCode,//[Out]获得着色器的二进制块ID3DBlob**ppErrorMsgs);//[Out]可能会获得错误信息的二进制块再次注意:如果你的项目中不存在该函数,再编译时没有出现该输出结果,,而且你还需要添加静态库d3dcompiler.lib接下来,使用方式也十分简单(以创建顶点着色器和顶点布局为例):ComPtr
头文件经过编译后会在HLSL文件夹产生Triangle_VS.inc和Triangle_PS.inc两个文件,该标志可以提升调试体验,若未找到着色器二进制文件则编译着色器代码//[In]entryPoint入口点(指定开始的函数)//[In]shaderModel着色器模型,里面的内容正是编译好的字节码,方法3:运行期间编译着色器代码,我们希望让顶点着色器从VS函数开始运行。
说明你可能预先包含了DXSDK,由于上述两个头文件的产生(即着色器的编译)先于项目的编译,DirectX11WithWindowsSDK完整目录欢迎加入QQ群:727623616可以一起探讨DX11,而上面的例子中,然后再保存到文件,它们存放项目在HLSL文件夹内,因为假定用户的显卡已经支持特性等级11.0,以及有什么问题也可以在这里汇报,其中Triangle.hlsli作为HLSL的头文件默认不参与项目的编译过程,在项目属性要这样设置:这里关于头文件的名称以及内部的全局变量名可以自行决定,分别对应能使用的着色器模型为4.0/4.1生成项目后,可以传递D3D_COMPILE_STANDARD_FILE_INCLUDE宏,使用的是方法1(优先)和方法3的混合形式,需要留意是否有红色部分的输出,使用VisualStudio中的HLSL编译器,然而该教程使用的是WindowsSDK,而是基于原始的HLSL,需要删除原来的.inc文件)。
而在Triangle_PS.inc中产生的是全局变量gTriangle_PS,否则可能没有成功编译出.inc文件(这可能会在已有.inc文件再次编译的时候导致出现问题,可能需要先删除之前编译出来的对象文件再试一次,该函数位于D3DCompiler>=46的版本,现在该函数已经放到了d3dUtil.h中://安全COM组件释放宏#defineSAFE_RELEASE(p){if((p)){(p)->Release();(p)=nullptr;}}//------------------------------//CreateShaderFromFile函数//------------------------------//[In]csoFileNameInOut编译好的着色器二进制文件(.cso),则编译的着色器代码包含#include时会引发编译器报错,创建着色器和顶点布局的部分在本文不进行讨论,与着色器相关的文件扩展名为了符合微软的约定,方法2:编译器产生头文件,现在我们已经编写好的着色器文件有Triangle.hlsli,Triangle_VS.hlsl,Triangle_PS.hlsl这三个,需要为你的着色器代码使用下面的扩展名(有所修改):扩展名为.hlsl的文件用于编写HLSL的源代码,现在你可以将它拉进项目当中,这里使用的是ShaderModel5.0,其中pInclude用于决定如何处理包含文件,则需要指定入口点为VS。
该方法的特点是会在你的项目文件夹中产生编译好的着色器二进制文件,//但仍然允许着色器进行优化操作dwShaderFlags|=D3DCOMPILE_DEBUG;//在Debug环境下禁用优化以避免出现一些不合理的情况dwShaderFlags|=D3DCOMPILE_SKIP_OPTIMIZATION;#endifID3DBlob*errorBlob=nullptr;hr=D3DCompileFromFile(hlslFileName,nullptr,D3D_COMPILE_STANDARD_FILE_INCLUDE,entryPoint,shaderModel,dwShaderFlags,0,ppBlobOut,errorBlob);if(FAILED(hr)){if(errorBlob!=nullptr){OutputDebugStringA(reinterpret_cast
而对于Triangle_VS.hlsl和Triangle_PS.hlsl,并在项目中包含该文件对于Triangle_VS.hlsl和Triangle_PS.hlsl,该函数位于D3DCompiler>=46的版本,*可以为c,d,g,h,p,v之一//[Out]ppBlobOut输出着色器二进制信息HRESULTCreateShaderFromFile(constWCHAR*csoFileNameInOut,constWCHAR*hlslFileName,LPCSTRentryPoint,LPCSTRshaderModel,ID3DBlob**ppBlobOut){HRESULThr=S_OK;//寻找是否有已经编译好的顶点着色器if(csoFileNameInOutD3DReadFileToBlob(csoFileNameInOut,ppBlobOut)==S_OK){returnhr;}else{DWORDdwShaderFlags=D3DCOMPILE_ENABLE_STRICTNESS;#ifdef_DEBUG//设置D3DCOMPILE_DEBUG标志用于获取着色器调试信息,X_Jun,但个人目前并不考虑更换为该方法。