我正在使用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代码吗?我不确定请帮忙
答案 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;
}
我希望编译器的错误更具体地说明正在发生的事情,但是反复试验才能解决问题。