Этот сайт очень плохой, так как на нем вообще отсутствует проверка ошибок. Каждый вызов DirectX, который возвращает HRESULT ДОЛЖЕН , проверяется на наличие ошибок. Если он возвращает S_OK, все в порядке. Проверьте документацию и убедитесь, что вы проверяете КАЖДОЕ возвращаемое значение DirectX.
Ваш шейдер, вероятно, имеет ошибки и не может скомпилироваться, поэтому вы, вероятно, передаете NULL-указатель в CreateVertexShader.
Вот как я проверяю ошибки:
Сначала поместите это куда-нибудь (для этого вам не нужны все эти включения и библиотеки, но я не уверен, что это необходимо для работы):
#include <D3D11.h>
#include <DXGI.h>
#include <DxErr.h>
#include <D3D11Shader.h>
#include <D3Dcompiler.h>
#include <D3DX11async.h>
#if defined(_DEBUG)
#pragma comment(lib,"d3dx11d.lib")
#else
#pragma comment(lib,"d3dx11.lib")
#endif
#pragma comment(lib,"d3d11.lib")
#pragma comment(lib,"dxgi.lib")
#pragma comment(lib,"DxErr.lib")
#pragma comment(lib,"d3dcompiler.lib")
#ifndef HR
#define HR(x){HRESULT hr=x;if(FAILED(hr)){DXTraceW(__FILE__,(DWORD)__LINE__,hr,L#x,true);TRUE;}}
#endif
Теперь для каждого вызова DirectX, который возвращает HRESULT (все вызовы Create * или вызовы compile_shader_from_file), сделайте следующее:
HR(device->CreateVertexShader(shaderBlob->GetBufferPointer(),shaderBlob->GetBufferSize(),NULL,&vs));
Обратите внимание на "HR (" в начале и, очевидно, еще один ")" в самом конце. Если этот вызов DirectX не удается, вы получите сообщение об ошибке.
Дополнительно для шейдеров вы должны получить больше данных, чтобы увидеть, что вы на самом деле облажались при написании кода HLSL. Вот как я это делаю:
ID3D10Blob* shaderBlob=NULL;
ID3D10Blob* errorBlob=NULL;
HR(D3DX11CompileFromFileA(fileName.c_str(),macros,NULL,mainFunction.c_str(),shaderModel.c_str(),
shaderCompileFlags,0,NULL,&shaderBlob,&errorBlob,NULL));
if(errorBlob)
{
char* es=reinterpret_cast<char*>(errorBlob->GetBufferPointer());
NXMsg("ERROR",es);// Shows error message box
errorBlob->Release();
return NULL;
}
Формат файлов с кодом HLSL не имеет значения. Обычно люди выбирают что-то вроде .hlsl, .vs (вершинный шейдер), .ps (пиксельный шейдер) или что-то еще.