HLSL:Triangle-2-Points / Lines Geometry Shader问题

时间:2014-06-11 13:17:56

标签: hlsl directx-11 geometry-shader

我尝试使用几何着色器扩展渲染器(对于TressFX),因此我采用了babysteps以便看到一切正常。因此,我创建了一个simpel pass-through Geometry Shader,它适用于三角形,但由于某种原因不适用于线条或点(将三角形转换为线条和点),因为我无法看到输出。 Result link

如果有人能指出为什么它不适用于线和点,我会很高兴。

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();
}

但是,如果我在Point / Line直通几何着色器中硬编码output.Position,我可以设法得到一个我可以在屏幕上看到的输出。

1 个答案:

答案 0 :(得分:0)

我认为你不能改变几何着色器中的原始拓扑。要将网格渲染为线/点,您可能需要在渲染函数中设置它,如下所示。

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

另一件事是,如果要更改几何着色器中的基本类型,则应使用

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的第一个参数