-1

私の質問は非常に単純であることを願っていますが、データの流れが正しくないようです。問題は、テクスチャ座標と法線データを頂点シェーダーからテッセレーション ステージ (ハルおよびドメイン シェーダー) を介して、レンダリングのためにピクセル シェーダーに渡す方法です。

私が直面している問題は、テッセレーションを使用する前に、データを頂点からピクセル シェーダーに単純に渡すことができることです。これら 2 つのシェーダーの間には、パッチ定数関数、ハル シェーダー、ドメイン シェーダーの間に複数のステップがあります。

これらの各セクションを介してデータを渡す方法について誰かが私に洞察を与えることができれば、それを示すための簡単な疑似コードがあれば、とても感謝しています。さらに情報が必要な場合、または私の現在のコード (動作しない場合でも) が必要な場合は、お知らせください。

追加情報: このプログラムは、HLSL を使用した DirectX 11 API を使用して C++ で記述されています。

4

3 に答える 3

0

エラーメッセージなどの状況を説明していないので、簡単な例が必要だと思います。

ここに 1 つがあります: http://www.rastertek.com/dx11tut38.html

著者は、コードのほぼすべての行を簡単に説明しました。レンダリング パイプラインの各ステージ間のデータ構造を定義する方法を理解するために、テッセレーション ステージの部分を見ることができます。

また、デバッグ情報を有効にしてシェーダー コードをコンパイルすることをお勧めします。 http://msdn.microsoft.com/zh-tw/library/windows/desktop/ff476261(v=vs.85).aspx

これにより、シェーダー プログラムの何が問題なのかを知ることができます。おそらく、自分ですぐに解決できるでしょう。

下にコメントしたかったのですが、なぜかコメントボタンが消えてしまいました。

于 2013-01-07T15:13:18.503 に答える
0

これは、テッセレーションを作成するために使用したコードです。必要なものだけを表示するために一部のコードを非表示にしています。ps: tess_factor は、定数バッファーのパラメーターです。

HS_OUTPUT_DATA hs_patch(InputPatch<VERTEX_PASS, 3> ip, uint pid : SV_PrimitiveID)
{
HS_OUTPUT_DATA ret;
float tess = tess_factor;
ret.edges[0] = ret.edges[1] = ret.edges[2] = tess;
ret.inside = tess; // same value that edges
return ret;
}

[domain("tri")]
[partitioning("integer")] // integer, fractional_even, fractional_odd
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("hs_patch")]
HS_OUTPUT hs(InputPatch<VERTEX_PASS, 3> ip, uint index : SV_OutputControlPointID)
{
HS_OUTPUT ret;
ret.pos = ip[index].pos;
return ret;
}

[domain("tri")]
VERTEX_PASS ds(HS_OUTPUT_DATA input, float3 dl : SV_DomainLocation, const     
OutputPatch<HS_OUTPUT, 3> bp)
{
    VERTEX_PASS ret;
    ret.pos = bp[0].pos * dl.x + bp[1].pos * dl.y + bp[2].pos * dl.z;
    return ret;
}
于 2012-12-27T15:14:44.407 に答える
0

Vertex、Hull、Domain、Pixel Shader の定数バッファーが分離されています。アプリケーションのコード ビハインドで、使用する定数バッファーにパラメーターを設定します。

ID3D11DeviceContext::PSSetConstantBuffers
ID3D11DeviceContext::HSGetConstantBuffers

最初の関数は、ピクセル シェーダーが使用する定数バッファーを設定します。ハル シェーダーの 2 番目のセット。ただし、あなたの場合、構造体を使用してパラメーターを転送する必要があります。これは、色のみを渡すための私のコードです:

struct VERTEX_PASS
{
    float4 pos : SV_POSITION;
    float4 color : COLOR;
};

struct HS_OUTPUT_DATA
{
    float4 pos : WORLDPOS;
    float4 color : COLOR;
    float edges[3] : SV_TessFactor; // not using in this example
    float inside : SV_InsideTessFactor; // not using in this example
};

HS_OUTPUT_DATA hs_patch(InputPatch<VERTEX_PASS, 3> ip, uint pid : SV_PrimitiveID)
{
    HS_OUTPUT_DATA ret;
    ret.color = ip[pid].color; // pass the color to forward
    return ret;
}

テクスチャ座標も同じ考えですが、色はすべての頂点で一定です。テクスチャ座標の場合、ドメイン シェーダー ステージで、最終的な頂点位置を計算するように、新しい UV 座標を計算する必要があります。

于 2012-12-27T15:40:10.420 に答える