繁体   English   中英

使用几何着色器指向四边形扩展

[英]Point to quad expansion with Geometry Shader

我是几何着色器的新手,所以我试图制作一个几何着色器,该几何着色器将以一个点并使用纹理坐标创建一个四边形,以作为示例,以了解几何着色器的工作原理。 这是我编写的代码:

Texture2D txDiffuse : register( t0 );
SamplerState samAnisotropic
{
    Filter = ANISOTROPIC;
    MaxAnisotropy = 4;
};

cbuffer cbFixed
{
    //
    // Compute texture coordinates to stretch texture over quad.
    //

    float2 gTexC[4] = 
    {
        float2(0.0f, 1.0f),
        float2(0.0f, 0.0f),
        float2(1.0f, 1.0f),
        float2(1.0f, 0.0f)
    };
};

cbuffer ConstantBuffer : register( b0 )
{
    matrix World;
    matrix View;
    matrix Projection;
}
struct VS_INPUT
{
    float3 Pos : POSITION;
};

struct VertexOut
{
    float3 Pos : POSITION;
};

struct GeoOut
{
    float4 PosH    : SV_POSITION;
    float2 Tex     : TEXCOORD;
    uint   PrimID  : SV_PrimitiveID;
};

VertexOut VS( VS_INPUT input )
{
    VertexOut output;

    output.Pos = input.Pos;

    return output;
}

[maxvertexcount(4)]
void GS(point VertexOut gin[1], uint primID : SV_PrimitiveID, inout TriangleStream<GeoOut> tristream)
{
    float4 v[4];
    v[0] = float4(gin[0].Pos + float3(1.0f, -1.0f, 0.0f), 1.0f);
    v[1] = float4(gin[0].Pos + float3(1.0f, 1.0f, 0.0f), 1.0f);
    v[2] = float4(gin[0].Pos + float3(-1.0f, -1.0f, 0.0f), 1.0f);
    v[3] = float4(gin[0].Pos + float3(-1.0f, 1.0f, 0.0f), 1.0f);

    GeoOut gout;
    [unroll]
    for (int i = 0; i < 4; i++)
    {
        gout.PosH = mul(v[i], World);
        gout.PosH = mul(v[i], View);
        gout.PosH = mul(v[i], Projection);
        gout.Tex = gTexC[i];
        gout.PrimID = primID;

        tristream.Append(gout);
    }
}

float4 PS( GeoOut input) : SV_Target
{
    //return txDiffuse.Sample( samAnisotropic, input.Tex );
    return float4( 1.0f, 1.0f, 1.0f, 1.0f );
}

编译此代码时,出现空白屏幕。 起初我以为可能是纹理问题,所以我尝试将像素着色器输出为白色,但这没有帮助。 接下来,我认为由于三角形的缠绕方式可能无法显示,因此我禁用了背面剔除,但仍然没有帮助。 我不确定接下来要尝试什么。 关于这个问题有什么想法吗?

我从未使用过几何着色器,但是我认为您计算gout.PosH的方式是错误的。 它应该是

float4 p = mul(v[i], World);
       p = mul(p, View);
       p = mul(p, Projection);
gout.PosH = p;

看看你哪里出问题了吗? 希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM