【问题标题】:HLSL: Triangle-2-Points/Lines Geometry Shader issueHLSL:Triangle-2-Points/Lines Geometry Shader 问题
【发布时间】:2014-06-11 13:17:56
【问题描述】:

我正在尝试使用几何着色器扩展渲染器(用于 TressFX),因此我正在采取婴儿步骤以确保一切正常。因此,我创建了一个简单的传递几何着色器,它适用于三角形,但由于某种原因不适用于线或点(将三角形转换为线和点),因为我看不到输出。 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();
}

但是,如果我在点/线传递几何着色器中对 output.Position 进行硬编码,我可以设法获得可以在屏幕上看到的输出。

【问题讨论】:

    标签: hlsl directx-11 geometry-shader


    【解决方案1】:

    我认为您无法更改几何着色器中的原始拓扑。要将网格渲染为线/点,您可能需要在渲染函数中进行如下设置。

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

    【讨论】:

    • 我认为你错了。 IASetPrimitiveTopology 仅影响几何着色器作为输入接收的原始拓扑。允许更改发出的原始拓扑。
    • 我也遇到过类似的问题,我将 D3D11_RASTERIZER_DESC 设置为 CullMode = D3D11_CULL_NONE 后解决了。似乎光栅化器以某种方式剔除了我所有的线条。
    猜你喜欢
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 2011-09-01
    • 2021-09-12
    • 2015-09-15
    • 2017-12-13
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多