Проект библиотеки:
Файл заголовка:
class Shader
{
public:
ID3DXBuffer* shader;
ID3DXBuffer* errorBuffer;
IDirect3DVertexShader9* DiffuseShader;
ID3DXConstantTable* DiffuseConstTable;
D3DXMATRIX View;
D3DXMATRIX Proj;
SUPERLIB_API Shader();
SUPERLIB_API HRESULT loadShader(LPCSTR,LPCSTR,LPCSTR);
SUPERLIB_API void UpdateShader(D3DXMATRIX, D3DXMATRIX);
SUPERLIB_API void SetVector(LPCSTR, D3DXVECTOR4);
SUPERLIB_API void SetMatrix(LPCSTR, D3DXMATRIX);
SUPERLIB_API void SetFloat(LPCSTR, FLOAT);
SUPERLIB_API void SetInt(LPCSTR, INT);
};
Файл исходного кода:
HRESULT Shader::loadShader(LPCSTR sourse, LPCSTR point, LPCSTR version)
{
HRESULT hr=0;
hr = D3DXCompileShaderFromFile(
sourse,
0,
0,
point, // имя точки входа
version,
D3DXSHADER_AVOID_FLOW_CONTROL,
&shader,
&errorBuffer,
&DiffuseConstTable);
if(errorBuffer)
{
::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);
Release<ID3DXBuffer*>(errorBuffer);
}
if(FAILED(hr))
{
::MessageBox(0, "Ошибка компиляции шейдера", 0, 0);
return false;
}
if(Device)
Device->CreateVertexShader((DWORD*)shader->GetBufferPointer(), &DiffuseShader);
if(FAILED(hr))
{
::MessageBox(0, "CreateVertexShader - FAILED", 0, 0);
return false;
}
Release<ID3DXBuffer*>(shader);
DiffuseConstTable->SetDefaults(Device);
return true;
}
После подключения библиотеки, в проекте пишу:
diffuse.loadShader("VertexShader.hlsl", "main","vs_1_1");
Результата, разумеется, нет.
Кстати, во время ошибки вылазит некоторая служебная информация от студии. Там указаны значения каждого из объектов. Что странно - вроде в объекте шейдера все в порядке, а вот объект Device всегда содержит 0x00000000.
