DirectX实现ID3DInclude接口

时间:2019-07-04 07:15:28

标签: include directx-11

我正在使用D3DCompileFromFile编译文件,并在单独的文件中创建了我的着色器

文件名VShader.hlsl

struct VOut
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

VOut VShader(float4 position : POSITION, float4 color : COLOR)
{
    VOut output;

    output.position = position;
    output.color = color;

    return output;
}

文件名PShader.hlsl

# include "SimpleTri/VShader.hlsl"

float4 PShader(float4 position : SV_POSITION, float4 color : COLOR) : SV_TARGET
{
    return color;
}

包含文件

# include "SimpleTri/VShader.hlsl"

是相对文件位置,即文件VShader.hlsl位于目录$(ProjectDir)/ SimpleTri /

要加载包含文件,我创建了自己的自定义包含类

HRESULT Include::Open
(
    D3D_INCLUDE_TYPE IncludeType,
    LPCSTR           pFileName,
    LPCVOID          pParentData,
    LPCVOID          *ppData,
    UINT             *pBytes
)
{
 ID3DBlob* blob;

 CString D(pFileName);
 D3DReadFileToBlob(D.GetBuffer(), &blob);
 D.ReleaseBuffer();

 memcpy(ppData,blob->GetBufferPointer(),blob->GetBufferSize());
 (*pBytes) = blob->GetBufferSize();
 blob->Release();

 return S_OK;
}

HRESULT Include::Close(LPCVOID data) 
{
 return S_OK; 
}

但是当我编译像素着色器[顶点着色器可以编译]时出现错误

position : SV_POSITION;SimpleTri/VShader.hlsl(1,1)error X3000:syntax error: unexpected integer constant

好像我的文件没有正确加载,但是当我检查加载的内容时,代码是正确的。

我应该改为加载已编译的VertexShader代码吗?我不确定请帮忙

1 个答案:

答案 0 :(得分:0)

结果是我从刚要更改的Open方法返回之前关闭了Blob

打开方法中的此代码

memcpy(ppData,blob->GetBufferPointer(),blob->GetBufferSize());
 (*pBytes) = blob->GetBufferSize();
 blob->Release();

为此

(*ppData)=blob->GetBufferPointer();
(*pBytes) = blob->GetBufferSize();

并且不得不在“关闭方法”中关闭blob

HRESULT Include::Close(LPCVOID data) 
{
 blob->Release();
 return S_OK; 
}

我希望编译器的错误更具体地说明正在发生的事情,但是反复试验才能解决问题。