2

私のプログラムは、線分で構成される入力を受け取り、線分を円柱状のオブジェクトに展開します ( 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));
}
4

2 に答える 2

1

位置を使用しているかどうかを確認しますfloat4。ベクトルのw値は、シーンの最終位置のスケールです。例:

float4 pos0 = float4(5, 5, 5, 1);
// is equals that:
float4 pos1 = float4(10, 10, 10, 2);

位置を修正するに.xyzは、ベクトル位置の値のみを変更する必要があります。

于 2013-01-07T15:04:40.417 に答える
0

パラメータを変更した後、毎回頂点バッファとストリーム出力バッファを再構築することでこの問題を解決しましたが、この問題の正確な原因はまだわかりません。

于 2013-01-31T18:09:06.423 に答える