私のプログラムは、線分で構成される入力を受け取り、線分を円柱状のオブジェクトに展開します ( DX SDK サンプル ブラウザーのPipeGSプロジェクトのように)。
パイプの半径スケーリング パラメータの配列を追加し、それらを手続き的に変更しましたが、パイプの半径は変更されませんでした。
スケーリング パラメータをピクセル値として設定しているため、フレームごとにスケーリング パラメータが更新されることは間違いありません。それらを変更すると、パイプの色が変わりますが、半径は変わりません。
そのため、GS でグローバル変数を使用する際に何らかの制限があるかどうか疑問に思っていますが、インターネット上では見つかりませんでした。(または、使用したキーワードが間違っているだけです)
シェーダーコードは次のようになります
cbuffer {
.....
float scaleParam[10];
.....
}
// Pass 1
VS_1 { // pass through }
// Tessellation stages
// Hull shader, domain shader and patch constant function
GS_1 {
pipeRadius = MaxRadius * scaleParam[PipeID];
....
// calculate pipe positions base on line-segments and pipeRadius
....
OutputStream.Append ( ... );
}
// Pixel shader is disabled in the first pass
// Pass 2
VS_2 { // pass through }
// Tessellation stages
// Hull shader, domain shader and patch constant function
// Transform the vertices and normals to world coordinate in DS
// No geometry shader in the second pass
PS_2
{
return float4( scaleParam[0], scaleParam[1], scaleParam[2], 0.0f );
}
編集:問題を縮小しました。私のプログラムには 2 つのパスがあります。最初のパスでは、ジオメトリ シェーダーとストリーム アウトで拡大する線分を計算します。
2 番目のパスでは、プログラムは 1 番目のパスからパイプの位置を受け取り、パイプをテッセレーションし、ディスプレイスメント マッピングを適用して、パイプをより詳細に表示できるようにします。
2 番目のパスにあるサーフェス テッセレーション ファクターとピクセル カラーを変更し、結果を画面ですぐに確認できます。
scaleParam を変更すると、パイプの色が変わりますが、半径は変わりません。これは、scaleParam を変更してシェーダーに正しく渡したことを意味しますが、最初のパスで何かが間違っています。
2番目の編集:
上記のシェーダー コードを変更し、cpp ファイルのコードをここに投稿します。cpp ファイルで:
void DrawScene()
{
// Update view matrix, TessFactor, scaleParam etc.
....
....
// Bind stream-output buffer
ID3D11Buffer* bufferArray[1] = {mStreamOutBuffer};
md3dImmediateContext->SOSetTargets(1, bufferArray, 0);
// Two pass rendering
D3DX11_TECHNIQUE_DESC techDesc;
mTech->GetDesc( &techDesc );
for(UINT p = 0; p < techDesc.Passes; ++p)
{
mTech->GetPassByIndex(p)->Apply(0, md3dImmediateContext);
// First pass
if (p==0)
{
md3dImmediateContext->IASetVertexBuffers(0, 1,
&mVertexBuffer, &stride, &offset);
md3dImmediateContext->Draw(mVertexCount,0);
// unbind stream-output buffer
bufferArray[0] = NULL;
md3dImmediateContext->SOSetTargets( 1, bufferArray, 0 );
}
// Second pass
else
{
md3dImmediateContext->IASetVertexBuffers(0, 1,
&mStreamOutBuffer, &stride, &offset);
md3dImmediateContext->DrawAuto();
}
}
HR(mSwapChain->Present(0, 0));
}