2017-01-17 6 views
1

私は前回のレンダリングの問題を私が抱えているコアにまで減らしました。Direct3D11は線だけをレンダリングし、変わった順序で

Iは、平面(30標識)に配置された4つの頂点からなる、頂点バッファを有する:

1. .2 

0. .3 

と記載インデックスバッファ{0,1,2,3,0}

は今、私はD3D11_PRIMITIVE_TOPOLOGY_LINESTRIPでレンダリングするとき、私は期待される画像達成:

__ 
| | 
|__| 

をしかし、私はD3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIPでレンダリングするときの結果は次のとおりです。三角形のない充填がされていないことを

| /| 
|/ | 

注意実行されます。 D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELISTを使用する場合

さらに混乱、結果は:私は{0,1,2,0,2,3}にインデックスバッファを変更した場合

| 
| 

それはレンダリング:最初の間だけ1つの画素ラインである

|/
|/ 

2つの頂点が描画されています。

私は最も原始的な例に私のシェーダが低下している:

頂点シェーダ:

struct VertexInputType 
{ 
    float4 position : POSITION; 
}; 
struct PixelInputType 
{ 
    float4 position : SV_POSITION; 
}; 
PixelInputType VertexShader(VertexInputType input) 
{ 
    PixelInputType output; 
    input.position.w = 1.0f; 
    output.position = input.position; 
    return output; 
} 

ピクセルシェーダー:

:私は DirectX::XMFLOAT3を使用している頂点として

struct PixelInputType 
{ 
    float4 position : SV_POSITION; 
}; 
float4 PixelShader(PixelInputType input) : SV_TARGET 
{ 
    float4 color; 
    color.r = 0; 
    color.g = 0; 
    color.b = 0; 
    color.a = 1; 
    return color; 
} 

D3D11_INPUT_ELEMENT_DESC polygon_layout[1]; 
polygon_layout[0].SemanticName = "POSITION"; 
polygon_layout[0].SemanticIndex = 0; 
polygon_layout[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; 
polygon_layout[0].InputSlot = 0; 
polygon_layout[0].AlignedByteOffset = 0; 
polygon_layout[0].InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA; 
polygon_layout[0].InstanceDataStepRate = 0; 
d3d11_device->CreateInputLayout(polygon_layout, 1, compiled_vshader_buffer->GetBufferPointer(), compiled_vshader_buffer->GetBufferSize(), &input_layout); 


D3D11_BUFFER_DESC vertex_buffer_desc; 
vertex_buffer_desc.Usage = D3D11_USAGE_DEFAULT; 
vertex_buffer_desc.ByteWidth = sizeof(DirectX::XMFLOAT3) * 4; 
vertex_buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; 
vertex_buffer_desc.CPUAccessFlags = 0; 
vertex_buffer_desc.MiscFlags = 0; 
vertex_buffer_desc.StructureByteStride = 0; 
DirectX::XMFLOAT3 vertices[4]; 
vertices[0].x = -0.5; vertices[0].y = -0.5; vertices[0].z = 0; 
vertices[1].x = -0.5; vertices[1].y = 0.5; vertices[1].z = 0; 
vertices[2].x = 0.5; vertices[2].y = 0.5; vertices[2].z = 0; 
vertices[3].x = 0.5; vertices[3].y = -0.5; vertices[3].z = 0; 
D3D11_SUBRESOURCE_DATA vertex_buffer_data; 
vertex_buffer_data.pSysMem = vertices; 
vertex_buffer_data.SysMemPitch = 0; 
vertex_buffer_data.SysMemSlicePitch = 0; 
hr = d3d11_device->CreateBuffer(&vertex_buffer_desc, &vertex_buffer_data, &vertex_buffer); 

D3D11_BUFFER_DESC index_buffer_desc; 
index_buffer_desc.Usage = D3D11_USAGE_DEFAULT; 
index_buffer_desc.ByteWidth = sizeof(int32_t) * 6; 
index_buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; 
index_buffer_desc.CPUAccessFlags = 0; 
index_buffer_desc.MiscFlags = 0; 
index_buffer_desc.StructureByteStride = 0; 
int32_t indices[6]; 
indices[0] = 0; 
indices[1] = 1; 
indices[2] = 2; 
indices[3] = 2; 
indices[4] = 3; 
indices[5] = 0; 
D3D11_SUBRESOURCE_DATA index_buffer_data; 
index_buffer_data.pSysMem = indices; 
index_buffer_data.SysMemPitch = 0; 
index_buffer_data.SysMemSlicePitch = 0; 
hr = d3d11_device->CreateBuffer(&index_buffer_desc, &index_buffer_data, &index_buffer); 

// during rendering I set: 
unsigned int stride = sizeof(DirectX::XMFLOAT3); 
unsigned int offset = 0; 
d3d11_context->IASetVertexBuffers(0, 1, &vertex_buffer, &stride, &offset); 
d3d11_context->IASetIndexBuffer(index_buffer, DXGI_FORMAT_R32_UINT, 0); 
d3d11_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); 
d3d11_context->RSSetState(rasterizer_state); 
d3d11_context->IASetInputLayout(input_layout); 
d3d11_context->VSSetShader(vertex_shader, NULL, 0); 
d3d11_context->PSSetShader(pixel_shader, NULL, 0); 
// and render with: 
d3d11_context->DrawIndexed(6, 0, 0); 

ID3D11ShaderReflection::GetGSInputPrimitive()でシェイダーを見ると、頂点シェーダーとピクセルシェーダーの両方にD3D_PRIMITIVE_UNDEFINEDが届きます。

ラスタライザステージをD3D11_FILL_SOLIDD3D11_CULL_NONEに設定しています。

D3D11コンテキストには、このような動作を説明できる設定や状態がありますか? 私はどこを見ても嬉しいです。 ありがとうございます!

+0

インデックス/頂点データを設定する呼び出しが問題になることはありますか?それらも同様に表示する必要があります。 – MuertoExcobito

+0

コメントありがとう!その情報を質問に追加しました。 – Makx

+0

私はあなたのコードに特に間違ったことは何も見ませんが、コードを見るだけでこの種のエラーを選ぶことはしばしば困難です。 Windows Graphics Diagnostics、Nvidia Nsightなどのフレームデバッグツールを実行することをお勧めします。 – MuertoExcobito

答えて

1

コードが問題ではないことが判明しました。以前の何かがDirect3D状態で変更されました。

context->ClearState();を呼び出して問題を解決しました。

1

まず、三角形のストリップが、あなたが期待するもの、つまり三角形のシーケンスを正確に描画します。三角形インデックス配列への各インデックスは、三つの前のインデックスと結合されて三角形を作成します。

私はあなたの三角形リストが3で割り切れないことをお勧めします.DirectXが正しくレンダリングされていない可能性があります(大容量システムであるため、速度を上げるために小切手と残高をスキップします)。

リスト、ストリップ、ファンなどの各描画モードの背後にあるロジックを確認して、正しい頂点の順序と描画モードを使用していることを確認してから、期待される結果を紙に描画してください。

幸運を祈る!

+0

コメントありがとう! インデックスバッファを{0,1,2,0,2,3}に設定しようとしました。私の理解では、三角形ストリップのように四角形を描くはずです。 しかし、最初の2つの頂点の間には常に1行しか描画されないようです。 – Makx

関連する問題