Nanashi-soft○プログラマ専用○DirectX11開発○
//ポリゴン頂点構造体このプログラムは動きません(ぉ
struct Vertex3D {
float pos[3]; //x-y-z
float col[4]; //r-g-b-a
};
const int TYOUTEN = 3; //ポリゴンの頂点数
//頂点データ(三角ポリゴン1枚)
Vertex3D hVectorData[TYOUTEN] = {
{ { +0.0f, +0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { +0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } },
{ { -0.5f, -0.5f, +0.5f }, { 1.0f, 1.0f, 1.0f, 1.0f } }
};
//頂点レイアウト
//5番目のパラメータは先頭からのバイト数なので,COLORにはPOSITIONのfloat型4バイト×3を記述
D3D11_INPUT_ELEMENT_DESC hInElementDesc[] = {
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 4*3, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};
//頂点バッファ作成
D3D11_BUFFER_DESC hBufferDesc;
hBufferDesc.ByteWidth = sizeof(Vertex3D) * TYOUTEN;
hBufferDesc.Usage = D3D11_USAGE_DEFAULT;
hBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
hBufferDesc.CPUAccessFlags = 0;
hBufferDesc.MiscFlags = 0;
hBufferDesc.StructureByteStride = sizeof(float);
D3D11_SUBRESOURCE_DATA hSubResourceData;
hSubResourceData.pSysMem = hVectorData;
hSubResourceData.SysMemPitch = 0;
hSubResourceData.SysMemSlicePitch = 0;
ID3D11Buffer* hpBuffer;
if(FAILED(hpDevice->CreateBuffer(&hBufferDesc, &hSubResourceData, &hpBuffer))){
MessageBox(hWnd, _T("CreateBuffer"), _T("Err"), MB_ICONSTOP);
goto End;
}
//その頂点バッファをコンテキストに設定
UINT hStrides = sizeof(Vertex3D);
UINT hOffsets = 0;
hpDeviceContext->IASetVertexBuffers(0, 1, &hpBuffer, &hStrides, &hOffsets);
//プリミティブ(ポリゴンの形状)をコンテキストに設定
hpDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
//頂点レイアウト作成
ID3D11InputLayout* hpInputLayout = NULL;
if(FAILED(hpDevice->CreateInputLayout(hInElementDesc, ARRAYSIZE(hInElementDesc), &g_vs_main, sizeof(g_vs_main), &hpInputLayout))){
MessageBox(hWnd, _T("CreateInputLayout"), _T("Err"), MB_ICONSTOP);
goto End;
}
//頂点レイアウトをコンテキストに設定
hpDeviceContext->IASetInputLayout(hpInputLayout);
//頂点シェーダー生成
ID3D11VertexShader* hpVertexShader;
if(FAILED(hpDevice->CreateVertexShader(&g_vs_main, sizeof(g_vs_main), NULL, &hpVertexShader))){
MessageBox(hWnd, _T("CreateVertexShader"), _T("Err"), MB_ICONSTOP);
goto End;
}
//頂点シェーダーをコンテキストに設定
hpDeviceContext->VSSetShader(hpVertexShader, NULL, 0);
//ピクセルシェーダー生成
ID3D11PixelShader* hpPixelShader;
if(FAILED(hpDevice->CreatePixelShader(&g_ps_main, sizeof(g_ps_main), NULL, &hpPixelShader))){
MessageBox(hWnd, _T("CreateVertexShader"), _T("Err"), MB_ICONSTOP);
goto End;
}
//ピクセルシェーダーをコンテキストに設定
hpDeviceContext->PSSetShader(hpPixelShader, NULL, 0);
//メインループ
MSG hMsg;
while(true){
while(PeekMessageW(&hMsg, NULL, 0, 0, PM_REMOVE)){
if(hMsg.message == WM_QUIT){
goto End;
}
TranslateMessage(&hMsg);
DispatchMessage(&hMsg);
}
//描画
hpDeviceContext->Draw(TYOUTEN, 0);
//バックバッファをスワップ
hpDXGISwpChain->Present(0, 0);
}
//入力用これを,vs.fxとして保存してください
struct vertexIn
{
float4 pos : POSITION0;
float4 col : COLOR0;
};
//出力用
struct vertexOut
{
float4 pos : SV_POSITION;
float4 col : COLOR;
};
vertexOut vs_main(vertexIn IN)
{
vertexOut OUT;
OUT.pos = IN.pos;
OUT.col = IN.col;
return OUT;
}
struct pixcelInps.fxで保存して,fxc.exeでコンパイルします
{
float4 pos : SV_POSITION;
float4 col : COLOR;
};
float4 ps_main(pixcelIn IN) : SV_Target
{
pixcelIn OUT;
//カラーをそのまま返す
OUT.col = IN.col;
return OUT.col;
}