DirectXを使用している3D描画にはまったく戸惑うので、私は非常に基本的なことを学びたかったので、私はウェブで見つけたすべての例を組み合わせて使用しようとしました。DirectX11 HLSLシェーダが実行されていません
私の第一の目的は、単に画面上の数行を描画することですが、これまでのところ、私は実現することができた唯一の事は私を描画するためには、いくつかの様々な色...
で画面をオフにしています2Dラインでは、実際にはVisual Studioの2015バージョンで直接csoファイルにコンパイルされたHLSL頂点とピクセルシェーダを使用します。 (私は当初、ピクセルシェーダに問題があったが、そのプロパティを設定する必要があることが分かった)
Visual Studioグラフィックアナライザ/デバッガを使用すると、と表示されるIAステップがわかる。線が描画されます。しかし、このステップの後、私は頂点シェーダで段階的にデバッグすることができますが、私は何も見ることができません。位置と色のパラメータに正しい値が表示されます。
主な問題は、ここでは、以下のとおりです。ピクセルの歴史の中で
- 、私はdeviceContextに発行されたすべてのドロー()の呼び出しを参照することはできません。私はClearRenderTargetを()
- ピクセルシェーダは、
私はプロセスで間違っているかわからない「いいえ出力リレー。ステージが実行されなかった」というメッセージを表示する世界/ビューです見ることができます/投影行列またはdepthStencilViewは必須ですか?私はswapChainとパイプラインに特定のバッファを提供することを忘れましたか?私は、奥行き、はさみ、およびcullingをrasterStateオブジェクトで無効にしようとしましたが、わかりません。私は次の行でコンパイルし
struct VIn
{
float4 position : POSITION;
float4 color : COLOR;
};
struct VOut
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
VOut main(VIn input)
{
VOut output;
output.position = input.position;
output.color = input.color;
return output;
}
:ここバーテックスシェーダのコードがあり、最後に
#define LINES_NB 1000
struct Point
{
float x, y, z, rhw;
float r, g, b, a;
} lineList[LINES_NB];
:
私はある私の頂点の構造体を使用
/Zi /E"main" /Od /Fo"E:\PATH\VertexShader.cso" /vs"_5_0" /nologo
そして、コードピクセルシェーダは次のとおりです。
私は次の行でコンパイルしstruct PIn
{
float4 position : SV_POSITION;
float4 color : COLOR;
};
float4 main(PIn input) : SV_TARGET
{
return input.color;
}
:
/Zi /E"main" /Od /Fo"E:\PATH\PixelShader.cso" /ps"_5_0" /nologo
これはラスタライザSTATE作成部です:
D3D11_RASTERIZER_DESC rasterDesc;
rasterDesc.AntialiasedLineEnable = false;
rasterDesc.CullMode = D3D11_CULL_NONE;
rasterDesc.DepthBias = 0;
rasterDesc.DepthBiasClamp = 0.0f;
rasterDesc.DepthClipEnable = false;
rasterDesc.FillMode = D3D11_FILL_WIREFRAME;
rasterDesc.FrontCounterClockwise = true;
rasterDesc.MultisampleEnable = false;
rasterDesc.ScissorEnable = false;
rasterDesc.SlopeScaledDepthBias = 0.0f;
result = _device->CreateRasterizerState(&rasterDesc, &_rasterState);
if (FAILED(result))
{
OutputDebugString("FAILED TO CREATE RASTERIZER STATE.\n");
HR(result);
return -1;
}
_immediateContext->RSSetState(_rasterState);
そして、これはありますINPUT LAYOUT登録部分(_vertexShaderCode-> code contains vertexShaderの内容CSOと_vertexShaderCode->サイズ、それらの内容のサイズ):などの変数が宣言されている
// create the input layout object
D3D11_INPUT_ELEMENT_DESC ied[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
HR(_device->CreateInputLayout(ied, sizeof(ied)/sizeof(D3D11_INPUT_ELEMENT_DESC), _vertexShaderCode->code, _vertexShaderCode->size, &_vertexInputLayout));
_immediateContext->IASetInputLayout(_vertexInputLayout);
:
struct Shader
{
BYTE *code;
UINT size;
};
ID3D11Device* _device;
ID3D11DeviceContext* _immediateContext;
ID3D11RasterizerState* _rasterState;
ID3D11InputLayout* _vertexInputLayout;
Shader* _vertexShaderCode;
Shader* _pixelShaderCode;
マイVERTEX BUFFERは、その後一度createLinesBufferを呼び出すことによって作成され、 、電話番号レンダリングをすべてのdrawcallでマッピングするために呼び出します。
void DxDraw::createLinesBuffer(ID3D11Device* device)
{
D3D11_BUFFER_DESC vertexBufferDesc;
ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));
vertexBufferDesc.Usage = D3D11_USAGE_DYNAMIC;
vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
vertexBufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
vertexBufferDesc.ByteWidth = sizeof(Point) * LINES_NB;
std::cout << "buffer size : " << sizeof(Point) * LINES_NB << std::endl;
vertexBufferDesc.MiscFlags = 0;
vertexBufferDesc.StructureByteStride = 0;
D3D11_SUBRESOURCE_DATA vertexBufferData;
ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));
vertexBufferData.pSysMem = lineList;
std::cout << "lineList : " << lineList << std::endl;
vertexBufferData.SysMemPitch = 0;
vertexBufferData.SysMemSlicePitch = 0;
HR(device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &_vertexBuffer));
}
void DxDraw::renderVertice(ID3D11DeviceContext* ctx, UINT count, D3D11_PRIMITIVE_TOPOLOGY type)
{
D3D11_MAPPED_SUBRESOURCE ms;
ZeroMemory(&ms, sizeof(D3D11_MAPPED_SUBRESOURCE));
// map the buffer
HR(ctx->Map(_vertexBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms));
// copy the data to it
memcpy(ms.pData, lineList, sizeof(lineList));
// unmap it
ctx->Unmap(_vertexBuffer, NULL);
// select which vertex buffer to display
UINT stride = sizeof(Point);
UINT offset = 0;
ctx->IASetVertexBuffers(0, 1, &_vertexBuffer, &stride, &offset);
// select which primtive type we are using
ctx->IASetPrimitiveTopology(type);
// draw the vertex buffer to the back buffer
ctx->Draw(count, 0);
}
おそらくこのリンクは何らかのヘルプの可能性があります https://social.msdn.microsoft.com/Forums/en-US/0df61157-056f- 46cd-a8c6-425f06acc5bb/direct3d-stage-did-run-no-output?forum = wpdevelop – SvinSimpe