私は現在 DirectX 11 を学んでおり、本「Beginning DirectX 11 programming」のデモの 1 つを試していました。本のガイドラインに従って、ウィンドウの作成と破棄 (d3d11 セットアップを含む) を処理する基本クラスを作成しました。他のすべてのデモは、このクラスに基づいています。そこで、2D 三角形を描くことを目的とした Triangle デモを作成しました。Triangle クラスの実装は次のとおりです。
#include "Triangle.h"
Triangle::Triangle(void): mVertexShader(0), mPixelShader(0), mInputLayout(0), mVertexBuffer(0)
{
}
Triangle::~Triangle(void)
{
}
void Triangle::Update(float deltaTime){
}
void Triangle::UnloadContent(){
if(mVertexShader)
mVertexShader->Release();
if(mPixelShader)
mPixelShader->Release();
if(mInputLayout)
mInputLayout->Release();
if(mVertexBuffer)
mVertexBuffer->Release();
mVertexBuffer = 0;
mPixelShader = 0;
mVertexShader = 0;
mInputLayout = 0;
}
bool Triangle::LoadContent(){
//Load Vertex Shader and make it active
ID3DBlob* vsBlob = 0;
if(!CompileShader(L"shaders.fx", "VS_Main", "vs_4_0", &vsBlob)){
MessageBox(0, L"Error Loading Vertex Shader", L"Compile Error", MB_OK);
return false;
}
HRESULT hr;
if(FAILED(hr = mDevice->CreateVertexShader(vsBlob->GetBufferPointer(), vsBlob->GetBufferSize(), 0, &mVertexShader))){
if(vsBlob)
vsBlob->Release();
return false;
}
D3D11_INPUT_ELEMENT_DESC vertexLayout[] = {
{
"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0
}
};
unsigned int layoutSize = ARRAYSIZE(vertexLayout);
if(FAILED(mDevice->CreateInputLayout(
vertexLayout,
layoutSize,
vsBlob->GetBufferPointer(),
vsBlob->GetBufferSize(),
&mInputLayout
))){
vsBlob->Release();
return false;
}
vsBlob->Release();
ID3DBlob* psBlob = 0;
if(!CompileShader(L"shaders.fx", "PS_Main", "ps_4_0", &psBlob)){
MessageBox(0, L"Error Loading Pixel Shader", L"Compile Error", MB_OK);
if(psBlob)
psBlob->Release();
return false;
}
if(FAILED(mDevice->CreatePixelShader(
psBlob->GetBufferPointer(),
psBlob->GetBufferSize(),
0,
&mPixelShader
))){
psBlob->Release();
return false;
}
psBlob->Release();
//vertex buffer creation
VertexPos vertices[] =
{
XMFLOAT3( 0.5f, 0.5f, 0.5f ),
XMFLOAT3( 0.5f, -0.5f, 0.5f ),
XMFLOAT3( -0.5f, -0.5f, 0.5f )
};
D3D11_BUFFER_DESC vertexDesc;
ZeroMemory(&vertexDesc, sizeof(vertexDesc));
vertexDesc.Usage = D3D11_USAGE_DEFAULT;
vertexDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexDesc.ByteWidth = sizeof(VertexPos) * 3;
D3D11_SUBRESOURCE_DATA subresourceData;
ZeroMemory(&subresourceData, sizeof(subresourceData));
subresourceData.pSysMem = vertices;
if(FAILED(mDevice->CreateBuffer(
&vertexDesc,
&subresourceData,
&mVertexBuffer
))){
return false;
}
return true;
}
bool Triangle::CompileShader(wchar_t* filePath, char* entry, char* shaderModel, ID3DBlob** buffer){
DWORD shaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
#if defined(DEBUG) || defined(_DEBUG)
shaderFlags |= D3DCOMPILE_DEBUG;
#endif
ID3DBlob* errorBuffer = 0;
HRESULT result;
result = D3DX11CompileFromFileW(
filePath,
0,0,
entry,
shaderModel,
shaderFlags,
0,0,
buffer,
&errorBuffer,
0
);
if(FAILED(result)){
if(errorBuffer != 0){
OutputDebugStringA((char*) errorBuffer->GetBufferPointer());
errorBuffer->Release();
}
return false;
}
if(errorBuffer)
errorBuffer->Release();
return true;
}
void Triangle::Render(){
float clearColor[4] = { 1.0f, 0.0f, 1.25f, 1.0f };
mDeviceContext->ClearRenderTargetView(mRenderTarget, clearColor);
unsigned int stride = sizeof(VertexPos);
unsigned int offset = 0;
mDeviceContext->IASetInputLayout(mInputLayout);
mDeviceContext->IASetVertexBuffers(0, 1, &mVertexBuffer, &stride, &offset);
mDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
mDeviceContext->VSSetShader(mVertexShader, 0, 0);
mDeviceContext->PSSetShader(mPixelShader, 0, 0);
mDeviceContext->Draw(3, 0);
mSwapChain->Present(0, 0);
}
これを実行すると、画面がクリアされ、指定した色になりますが、画面には何も描画されません。本で提供されているソースコードをコンパイルしただけで、問題なく動作することを確認してください. 使用するシェーダーも同じです。私のコンピューターは directx 11 をサポートしています。ほとんどの名前は一目瞭然だと思いますが、わかりにくい場合は私に尋ねてください。フレームワークを他のデモでテストしましたが、正常に動作します。コードでエラーが見つからないようです。