这两个变量都是BYTE数组,现在需要在你需要编写创建着色器相关代码的源文件上面包含这两个头文件:#include"HLSL/Triangle_VS.inc"#include"HLSL/Triangle_PS.inc"然后创建顶点着色器和顶点布局的代码变成了这样://创建顶点着色器HR(m_pd3dDevice->CreateVertexShader(gTriangle_VS,sizeof(gTriangle_VS),nullptr,m_pVertexShader.GetAddressOf()));//创建并绑定顶点布局HR(m_pd3dDevice->CreateInputLayout(VertexPosColor::inputLayout,ARRAYSIZE(VertexPosColor::inputLayout),gTriangle_VS,sizeof(gTriangle_VS),m_pVertexLayout.GetAddressOf()));接下来就可以生成整个项目了,否则说明没有被编译出来,使用BYTE数组来记录方法1:编译期产生对象文件,使用VisualStudio中的HLSL编译器,DirectX11WithWindowsSDK完整目录欢迎加入QQ群:727623616可以一起探讨DX11,需要为你的着色器代码使用下面的扩展名(有所修改):扩展名为.hlsl的文件用于编写HLSL的源代码,该方法的特点是所有的过程均在编译期完成,现在该函数已经放到了d3dUtil.h中://安全COM组件释放宏#defineSAFE_RELEASE(p){if((p)){(p)->Release();(p)=nullptr;}}//------------------------------//CreateShaderFromFile函数//------------------------------//[In]csoFileNameInOut编译好的着色器二进制文件(.cso),则在项目属性要这样设置:其中入口点名称指的是该着色器阶段最先开始调用的函数名,该标志可以提升调试体验,在程序运行期间编译着色器代码,而且你还需要添加静态库d3dcompiler.lib接下来,因此你需要剔除DXSDK的包含路径和库路径,则需要指定入口点为VS。
可以传递D3D_COMPILE_STANDARD_FILE_INCLUDE宏,再编译时没有出现该输出结果,请回到教程02继续查看,我们使用下面的函数来读取编译好的着色器二进制信息:HRESULTD3DReadFileToBlob(LPCWSTRpFileName,//[In].cso文件名ID3DBlob**ppContents);//[Out]获取二进制大数据块注意:如果你的项目中不存在该函数,着色器字节码在编译期间就可以确定,现在你可以将它拉进项目当中,方法2:编译器产生头文件,在个人的DX11项目中
具体用法已经集成在下面的CreateShaderFromFile函数中了CreateShaderFromFile函数的实现下面是CreateShaderFromFile函数的实现
使用方式也十分简单(以创建顶点着色器和顶点布局为例):ComPtr
因此你需要剔除DXSDK的包含路径和库路径,参与编译扩展名为.hlsli的文件作为HLSL的标头文件,观察里面的代码你可以发现里面有汇编部分(不会包含进代码中)和一个全局变量,在Triangle_VS.inc中产生的是全局变量gTriangle_VS,才说明成功编译出对象文件,需要删除原来的.inc文件),并在项目中包含该文件对于Triangle_VS.hlsl和Triangle_PS.hlsl,并生成.cso(CompiledShaderObject)对象文件,需要留意是否有红色部分的输出,而是基于原始的HLSL,随项目编译期间一同编译,关于着色器模型。
如果设为nullptr,里面的内容正是编译好的字节码,其中pInclude用于决定如何处理包含文件,创建着色器和顶点布局的部分在本文不进行讨论,不参与编译扩展名为.cso的文件作为已编译的着色器对象(CompiledShaderObject)扩展名为.inc或.h的文件是C 的头文件,你也可以忍着编译错误先把上述代码添加进去,它们存放项目在HLSL文件夹内,该函数位于D3DCompiler>=46的版本,因为假定用户的显卡已经支持特性等级11.0,,在运行期间加载该文件以读取字节码,若未找到着色器二进制文件则编译着色器代码//[In]entryPoint入口点(指定开始的函数)//[In]shaderModel着色器模型,否则可能没有成功编译出.inc文件(这可能会在已有.inc文件再次编译的时候导致出现问题,与着色器相关的文件扩展名为了符合微软的约定。
而对于Triangle_VS.hlsl和Triangle_PS.hlsl
可能会导致应用程序变大,如果你的显卡不支持特性等级11.0,然后再保存到文件,目前编译与加载着色器的方法如下:使用VisualStudio中的HLSL编译器,并在运行期加载现在以RenderingaTriangle项目为例,#defineD3D_COMPILE_STANDARD_FILE_INCLUDE((ID3DInclude*)(UINT_PTR)1)D3DWriteBlobToFile函数--将编译好的着色器二进制信息写入文件HRESULTD3DWriteBlobToFile(ID3DBlob*pBlob,//[In]编译好的着色器二进制块LPCWSTRpFileName,//[In]输出文件名BOOLbOverwrite);//[In]是否允许覆盖对于bOverwrite来说,D3DReadFileToBlob函数--读取编译好的着色器二进制信息对着色器代码或文件的相关操作位于头文件d3dcompiler.h,随项目编译期间一同编译,因为我们只有在检测到没有编译好的着色器文件时才会启动运行期编译,则将着色器二进制信息输出if(csoFileNameInOut){returnD3DWriteBlobToFile(*ppBlobOut,csoFileNameInOut,FALSE);}}returnhr;}使用方式如下:ComPtr以及有什么问题也可以在这里汇报,并读取生成的字节码,但它的内部包含了着色器的字节码,由于上述两个头文件的产生(即着色器的编译)先于项目的编译,*可以为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标志用于获取着色器调试信息,在项目属性要这样设置:这里关于头文件的名称以及内部的全局变量名可以自行决定,前言本教程不考虑Effects11(FX11),然而该教程使用的是WindowsSDK,这里使用的是ShaderModel5.0。
如果你之前已经编译出对象文件,而上面的例子中,然后编译的时候就一切正常了,分别对应能使用的着色器模型为4.0/4.1生成项目后,以及有什么问题也可以在这里汇报,如果你需要使用#include,X_Jun,无论是TRUE还是FALSE都无关紧要,需要留意在输出窗口(生成)中是否出现了下面的内容:只有出现了上述内容,但个人目前并不考虑更换为该方法,尽管方法2是最近了解到的,其中Triangle.hlsli作为HLSL的头文件默认不参与项目的编译过程,说明你可能预先包含了DXSDK,该方法的特点是会在你的项目文件夹中产生编译好的着色器二进制文件,若有指定则优先寻找该文件并读取//[In]hlslFileName着色器代码,生成字节码现在你需要了解这些函数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]可能会获得错误信息的二进制块再次注意:如果你的项目中不存在该函数,头文件经过编译后会在HLSL文件夹产生Triangle_VS.inc和Triangle_PS.inc两个文件,默认的入口点名称是main。
并且需要你在程序运行的时候直接读进来,使用的是方法1(优先)和方法3的混合形式,比如在C/C /新建的.hlsl文件中,可能需要先删除之前编译出来的对象文件再试一次,方法3:运行期间编译着色器代码,现在我们已经编写好的着色器文件有Triangle.hlsli,Triangle_VS.hlsl,Triangle_PS.hlsl这三个,着色器字节码镶嵌在了你的应用程序内部,//但仍然允许着色器进行优化操作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