2

Geometry Shader を使用して (TressFX 用の) レンダラーを拡張しようとしています。したがって、三角形に対しては機能するシンペル パススルー ジオメトリ シェーダーを作成しましたが、出力が表示されないため、何らかの理由で線または点 (三角形を線と点に変換) に対しては機能しません。結果リンク

線や点でうまくいかない理由を誰かが指摘してくれたらうれしいです。

コード

ASetPrimitiveTopology が D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST に設定されている

頂点シェーダー

struct PS_INPUT_HAIR_AA
{
    float4 Position : SV_POSITION;
    float4 Tangent  : Tangent;
    float4 p0p1     : TEXCOORD0;
};

PS_INPUT_HAIR_AA VS_RenderHair( uint vertexId : SV_VertexID )
{
    PS_INPUT_HAIR_AA Output = (PS_INPUT_HAIR_AA)0;

    Calculate position etc... 

    Output.Position = mul(float4(v, 1), g_mViewProj);
    Output.Tangent  = float4(t, ratio);
    Output.p0p1     = float4( v.xy, g_HairVertexPositions[vertexId+1].xy );

    return Output;
}

三角形のジオメトリ シェーダー(機能します)

[maxvertexcount(64)] // more than enough
void GS_RenderHairPassThrough( triangle PS_INPUT_HAIR_AA input[3], inout TriangleStream<PS_INPUT_HAIR_AA> OutputStream )
{   
    PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0;

    for(uint i = 0; i < 3; ++i) {
        output.Position = input[i].Position;
        output.Tangent  = input[i].Tangent;
        output.p0p1     = input[i].p0p1;
        OutputStream.Append( output );
    }
    OutputStream.RestartStrip();
}

点と線のジオメトリ シェーダー(これは機能しません)

[maxvertexcount(64)] // more than enough
void GS_RenderHairPassThrough( triangle PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream )
{   
    PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0;

    for(uint i = 0; i < 3; ++i) {
        output.Position = input[i].Position;
        output.Tangent  = input[i].Tangent;
        output.p0p1     = input[i].p0p1;
        OutputStream.Append( output );
        OutputStream.RestartStrip(); // Not sure if I need this
    }
}

[maxvertexcount(64)] // more than enough
void GS_RenderHairPassThrough( triangle PS_INPUT_HAIR_AA input[3], inout LineStream<PS_INPUT_HAIR_AA> OutputStream )
{   
    PS_INPUT_HAIR_AA output = (PS_INPUT_HAIR_AA)0;

    for(uint i = 0; i < 3; ++i) {
        output.Position = input[i].Position;
        output.Tangent  = input[i].Tangent;
        output.p0p1     = input[i].p0p1;
        OutputStream.Append( output );
    }
    OutputStream.RestartStrip();
}

ただし、ポイント/ライン パススルー ジオメトリ シェーダーで output.Position をハード コーディングすると、画面に表示される出力を取得できます。

4

1 に答える 1

0

ジオメトリ シェーダーでプリミティブ トポロジを変更できるとは思えません。メッシュを線/点としてレンダリングするには、次のようにレンダリング関数で設定することをお勧めします。

g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_LINELIST);
or
g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_POINTLIST);

もう 1 つのことは、ジオメトリ シェーダーでプリミティブ タイプを変更する場合は、使用する必要があります。

void GS_RenderHairPassThrough( line PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream )
or
void GS_RenderHairPassThrough( point PS_INPUT_HAIR_AA input[3], inout PointStream<PS_INPUT_HAIR_AA> OutputStream )

triangleの最初の引数として両方に使用しているのがわかりますGS_RenderHairPassThrough

于 2014-06-12T14:41:29.633 に答える