2016-05-03 21 views
0

DirectXを使用している3D描画にはまったく戸惑うので、私は非常に基本的なことを学びたかったので、私はウェブで見つけたすべての例を組み合わせて使用​​しようとしました。DirectX11 HLSLシェーダが実行されていません

私の第一の目的は、単に画面上の数行を描画することですが、これまでのところ、私は実現することができた唯一の事は私を描画するためには、いくつかの様々な色...

で画面をオフにしています2Dラインでは、実際にはVisual Studioの2015バージョンで直接csoファイルにコンパイルされたHLSL頂点とピクセルシェーダを使用します。 (私は当初、ピクセルシェーダに問題があったが、そのプロパティを設定する必要があることが分かった)

Visual Studioグラフィックアナライザ/デバッガを使用すると、と表示されるIAステップがわかる。線が描画されます。しかし、このステップの後、私は頂点シェーダで段階的にデバッグすることができますが、私は何も見ることができません。位置と色のパラメータに正しい値が表示されます。

VSGA report

主な問題は、ここでは、以下のとおりです。ピクセルの歴史の中で

  • 、私は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); 
} 
+1

おそらくこのリンクは何らかのヘルプの可能性があります https://social.msdn.microsoft.com/Forums/en-US/0df61157-056f- 46cd-a8c6-425f06acc5bb/direct3d-stage-did-run-no-output?forum = wpdevelop – SvinSimpe

答えて

1

問題を解決したのでコメントからコピーされました。

InputLayoutは正常に見えますが、VertexBufferもOKです。この時点で、実際の頂点座標を確認します。あなたのスクリーンショットからは、x = 271、y = 147のようなかなり大きい数字が使われているように見えます。通常、これらの位置はWorld-View-Projection変換によって変換されるので、< -1.0f; 1.0f; 1.0f >範囲。 lineGenerator関数を変更して、ジオメトリが< -1.0fになるように変更することをお勧めします。 1.0f>はx座標とy座標の範囲です。たとえば、現在のxの値が271の場合、それを0.271fとします

2

は、潜在的にあなたがチェックすることができ、ここで間違ってしまったかもしれない多くのものがあります。

  • が入力レイアウトが正しく

    を宣言されていますか?あなたの頂点シェーダーが幾何学を得られないように見える
  • どのようにラスターライザーステージを宣言しますか?時々、カリング、深度クリッピングなどの問題があるかもしれません。
  • ジオメトリはどのように見えますか?ジオメトリを入力アセンブラに適用する前に、ワールド/ビュー/投影変換を適用しますか?
  • どのようにして頂点バッファを構築しますか?マップ/マップ解除しますか?それとも、すべてのドローコールのためにこれを構成するのでしょうか?

これが役立つとは限りませんが、このすべては、このすべてをチェックアウトする価値があります。ピクセルシェーダからの出力用として

は、何もそれにfeededなかったようです - ので、VS出力またはRSのいずれかで何かがなければならない(なぜならカリング、デプステストなどの)何らかの形ですべてのジオメトリをクリップし

+0

もう一度これらの点をもう一度再確認しませんでしたが、私のコードからいくつかの関連サンプルで質問を更新しました。また、質問3「あなたのジオメトリはどのように見えますか? =>私はどこにでもMVPマトリックス変換を使用せず、どのD3DXMATRIXでも動作しません。 – KwentRell

+0

ねえ、今日あなたのサンプルをチェックしようとします。ポイント3については、どのように生成する頂点の位置の範囲は? DXパイプラインは、頂点のx、y、z、w値に基づいていくらかのクリッピングを実行するので、重要です。 -5.0fから-3.0fまでのX値を生成する場合、WVP行列を使用しないと、その点は表示されません。 –

+1

InputLayoutは正常に見え、VertexBufferはどちらかと思われます。この時点で、私は実際の頂点座標をチェックします。あなたのスクリーンショットから、x = 271、y = 147のようなかなり大きな数字を使用しているようです。通常、それらの位置はWorld-View-Projection変換によって変換されるので、最終的に<-1.0f;1.0f>の範囲になります。あなたは変換を使用していないので、** lineGenerator関数を変更してジオメトリを生成することをお勧めします。<-1.0f; 1.0f> xとy座標の範囲**たとえば、現在のx値が271の場合、0.271f –

関連する問題