DirectX, реализующий интерфейс ID3DInclude - PullRequest
0 голосов
/ 04 июля 2019

Я компилирую свои файлы, используя 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 голосов
/ 05 июля 2019

Оказывается, я закрыл блоб, прежде чем вернуться из открытого метода. Мне просто нужно было изменить

Этот код в открытом методе

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

На этот

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

И пришлось закрыть блоб в методе закрытия

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

Хотелось бы, чтобы ошибки компилятора были более конкретными в отношении того, что происходило, но метод проб и ошибок помог.

...