Directx 11 - CompileFromFile() is not compiling

Directx 11 - CompileFromFile() is not compiling

本文关键字:is not compiling CompileFromFile Directx      更新时间:2023-10-16

所以,我不确定我是否错过了什么。

我有一个着色器类,我想从包含 DirectX 函数D3DCompileFromFile()的函数LoadFromFile()的文件加载和编译着色器,这是执行此操作所需的

void Shader::LoadFromFile(const char* file, const char* vsEntry, const char* psEntry)
{
DXCall(D3DCompileFromFile((LPCWSTR)file, 0, D3D_COMPILE_STANDARD_FILE_INCLUDE, vsEntry, "vs_5_0", 0, 0, &m_vsb, 0));
DXCall(D3DCompileFromFile((LPCWSTR)file, 0, D3D_COMPILE_STANDARD_FILE_INCLUDE, psEntry, "ps_5_0", 0, 0, &m_psb, 0));
DXCall(Renderer::Get()->GetDevice()->CreateVertexShader(m_vsb->GetBufferPointer(), m_vsb->GetBufferSize(), 0, &m_vs));
DXCall(Renderer::Get()->GetDevice()->CreatePixelShader(m_psb->GetBufferPointer(), m_psb->GetBufferSize(), 0, &m_ps));
...
}

我想像这样在 main 中调用该函数

Shader shader;
shader.LoadFromFile("res/Default.hlsl", "VS", "PS");

但是,当它到达创建顶点着色器函数时,我不断收到以下错误:

Exception thrown: read access violation. this->m_vsb was nullptr.

只是找不到文件还是着色器文件中有一些错误的代码?

struct VOut;
{
float4 Position : SV_POSITION;
float4 COLOR : COLOR;
};
VOut VS(float4 position : POSITION, float4 color : COLOR)
{
VOut output;
output.Position = position;
output.Color = color;
return output;
};
float4 PS(VOut input) : SV_TARGET
{
return input.Color;
};
D3DCompileFromFile

是一个仅宽字符的函数。您的file无效:

void Shader::LoadFromFile(const char* file, const char* vsEntry, const char* psEntry)
{
DXCall(D3DCompileFromFile((LPCWSTR)file, 0, D3D_COMPILE_STANDARD_FILE_INCLUDE, vsEntry, "vs_5_0", 0, 0, &m_vsb, 0));
DXCall(D3DCompileFromFile((LPCWSTR)file, 0, D3D_COMPILE_STANDARD_FILE_INCLUDE, psEntry, "ps_5_0", 0, 0, &m_psb, 0));

您应该切换LoadFromFile以采用const wchar_t*而不是const char*,或者执行转换:

void Shader::LoadFromFile(const char* file, const char* vsEntry, const char* psEntry)
{
wchar_t filePath[MAX_PATH] = {};
int oldLen = strlen(file);
const int newLen = MultiByteToWideChar(
CP_UTF8,
MB_ERR_INVALID_CHARS,
file,
oldLen,
filePath,
MAX_PATH);
DXCall(D3DCompileFromFile(filePath, 0, D3D_COMPILE_STANDARD_FILE_INCLUDE, vsEntry, "vs_5_0", 0, 0, &m_vsb, 0));
DXCall(D3DCompileFromFile(filePath, 0, D3D_COMPILE_STANDARD_FILE_INCLUDE, psEntry, "ps_5_0", 0, 0, &m_psb, 0));
相关文章: