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

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;


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

关于c++ - 使用几何着色器指向四边形扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24963209/

10-12 14:39
查看更多