私は3つの異なるシェーダーを使用しています:
- DirectX11 のテッセレーション機能を使用するためのテッセレーション シェーダ :)
- テッセレーションなしでどのように見えるかを示す通常のシェーダー
- FPS、モデル数などのデバッグ情報を表示するテキスト シェーダー。
これらのシェーダーはすべて最初に初期化されます。
キーボードを使用して、テッセレーション シェーダーと通常のシェーダーを切り替えてシーンをレンダリングできます。さらに、テキスト シェーダーを使用してデバッグ情報の表示を切り替えられるようにしたいと考えています。
テッセレーション シェーダーを実装してから、テキスト シェーダーが機能しなくなりました。DebugText (テキスト シェーダーを使用してレンダリング) をアクティブにすると、画面がしばらく黒くなり、Windows に次のメッセージが表示されます。
ディスプレイ ドライバーが応答を停止し、回復しました
これは、シーンのレンダリングに使用される 2 つのシェーダーのいずれかで発生します。
さらに、通常のシェーダーを使用してアプリケーションを起動し、シーンをレンダリングしてから、テッセレーション シェーダーに切り替えることができます。通常のシェーダーに戻そうとすると、テキスト シェーダーと同じエラーが発生します。
シェーダーを切り替えるときに間違っていることは何ですか? テキストを同時に表示するときに何が間違っていますか?
あなたが私を助けるのを助けるために私はどのファイルを投稿できますか? :) どうも
PSキー入力が間違った時間(レンダリング中など)に中断するかどうかはすでに確認しましたが、問題ないようです
試験手順
- テキストシェーダーなしの通常のシェーダー
- keyinput でテキスト シェーダーを通常のシェーダーに追加します (現在は動作します。テキスト シェーダーを頂点シェーダーとピクセル シェーダーのみに戻します) (z バッファーの何かがまだ間違っています...)
- テキスト シェーダーを削除し、キー入力でシェーダーをテッセレーション シェーダーに変更します。
- 次に、テキスト シェーダーを追加するか、レギュラー シェーダーに戻すと、
シェーダーの切り替え/レンダー
Renderer.cpp のコード スニペットでは、ブール値の "m_useTessellationShader" に従ってシェーダーを選択しています。
if(m_useTessellationShader)
{
// Render the model using the tesselation shader
ecResult = m_ShaderManager->renderTessellationShader(m_D3D->getDeviceContext(), meshes[lod_level]->getIndexCount(),
worldMatrix, viewMatrix, projectionMatrix, textures, texturecount,
m_Light->getDirection(), m_Light->getAmbientColor(), m_Light->getDiffuseColor(),
(D3DXVECTOR3)m_Camera->getPosition(), TESSELLATION_AMOUNT);
} else {
// todo: loaded model depends on distance to camera
// Render the model using the light shader.
ecResult = m_ShaderManager->renderShader(m_D3D->getDeviceContext(),
meshes[lod_level]->getIndexCount(), lod_level, textures, texturecount,
m_Light->getDirection(), m_Light->getAmbientColor(), m_Light->getDiffuseColor(),
worldMatrix, viewMatrix, projectionMatrix);
}
ここでは、ブール値の「useTessellationShader」に従ってタイポロジーを選択する Mesh.cpp のコード スニペットを示します。
// RenderBuffers is called from the Render function. The purpose of this function is to set the vertex buffer and index buffer as active on the input assembler in the GPU. Once the GPU has an active vertex buffer it can then use the shader to render that buffer.
void Mesh::renderBuffers(ID3D11DeviceContext* deviceContext, bool useTessellationShader)
{
unsigned int stride;
unsigned int offset;
// Set vertex buffer stride and offset.
stride = sizeof(VertexType);
offset = 0;
// Set the vertex buffer to active in the input assembler so it can be rendered.
deviceContext->IASetVertexBuffers(0, 1, &m_vertexBuffer, &stride, &offset);
// Set the index buffer to active in the input assembler so it can be rendered.
deviceContext->IASetIndexBuffer(m_indexBuffer, DXGI_FORMAT_R32_UINT, 0);
// Check which Shader is used to set the appropriate Topology
// Set the type of primitive that should be rendered from this vertex buffer, in this case triangles.
if(useTessellationShader)
{
deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST);
}else{
deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}
return;
}
レンダーシェーダー
頂点シェーダーとピクセル シェーダーのみを使用し、頂点シェーダー、ハル シェーダー、ドメイン シェーダー、ピクセル シェーダーの使用を切り替えた後に問題が発生する可能性はありますか? ここに私のアーキテクチャの簡単な概要があります:
TextClass: font.vs と font.ps を使用
deviceContext->VSSetShader(m_vertexShader, NULL, 0); deviceContext->PSSetShader(m_pixelShader, NULL, 0); deviceContext->PSSetSamplers(0, 1, &m_sampleState);
RegularShader: vertex.vs と pixel.ps を使用
deviceContext->VSSetShader(m_vertexShader, NULL, 0); deviceContext->PSSetShader(m_pixelShader, NULL, 0); deviceContext->PSSetSamplers(0, 1, &m_sampleState);
TessellationShader: tessellation.vs、tessellation.hs、tessellation.ds、tessellation.ps を使用
deviceContext->VSSetShader(m_vertexShader, NULL, 0); deviceContext->HSSetShader(m_hullShader, NULL, 0); deviceContext->DSSetShader(m_domainShader, NULL, 0); deviceContext->PSSetShader(m_pixelShader, NULL, 0); deviceContext->PSSetSamplers(0, 1, &m_sampleState);
ClearState
2 つのシェーダーを切り替えたいのですが、コンテキスト パラメータが異なっているようです。clearstate methodeでは、次のパラメーターを NULL にリセットすると述べています。
Direct3D クラスで次のことがわかりました。
- 深度ステンシル状態 -> m_deviceContext->OMSetDepthStencilState
- ラスタライザの状態 -> m_deviceContext->RSSetState(m_rasterState);
- ブレンド状態 -> m_device->CreateBlendState
- ビューポート -> m_deviceContext->RSSetViewports(1, &viewport);
すべてのシェーダー クラスで次のことがわかりました。
- 入力/出力リソース スロット -> deviceContext -> PSSetShaderResources
- シェーダー -> deviceContext->VSSetShader から - deviceContext->PSSetShader
- 入力レイアウト -> デバイス -> CreateInputLayout
- サンプラー状態 -> デバイス -> CreateSamplerState
この 2 つがわかりませんでした。どこで見つけることができますか?
- 述語 -> ?
- はさみの長方形 -> ?
すべてのスイッチ (キー入力) で Direct3d とシェーダーを再初期化するのは適切ではないので、それらを切り替えることができるようにすべてのローカルを保存する必要がありますか?!