【问题标题】:CPU face flipping vs GPU face flipping?CPU面翻转与GPU面翻转?
【发布时间】:2015-05-05 05:05:40
【问题描述】:

假设以下着色器代码,在 CPU 上生成三角形的另一边是否更有效:让 GPU 通过实例/世界矩阵转换双倍的顶点数量,或者在 GPU 上生成它:复制顶点的顺序不同并翻转法线?

有趣的着色器代码:

struct VS_IN
{
    float4 pos : POSITION;
    float3 norm : NORMAL;
    matrix instance : INSTANCEMATRIX;
    float4 color : INSTANCECOLOR;
};

struct PS_IN
{
    float4 pos : SV_POSITION;
    float3 norm : NORMAL;
    float4 color: COLOR;
};

cbuffer viewProj : register (b0)
{
    matrix viewProj;
} 

PS_IN VS(VS_IN input)
{
    PS_IN output = (PS_IN)0;

    output.pos = mul(mul(input.pos, input.instance), viewProj);
    output.norm = normalize(mul(input.norm, (float3x3)input.instance));
    output.color = input.color;

    return output;
};

[maxvertexcount(6)]
void FlipFaceGS(triangle PS_IN input[3], inout TriangleStream<PS_IN> OutputStream)
{
    OutputStream.Append(input[0]);
    OutputStream.Append(input[1]);
    OutputStream.Append(input[2]);
    OutputStream.RestartStrip();

    input[0].norm = -input[0].norm;
    input[1].norm = -input[1].norm;
    input[2].norm = -input[2].norm;

    OutputStream.Append(input[0]);
    OutputStream.Append(input[2]);
    OutputStream.Append(input[1]);
    OutputStream.RestartStrip();
}

technique10 Render
{
    pass P0
    {
        SetVertexShader(CompileShader(vs_4_0, VS()));
        SetGeometryShader(CompileShader(gs_4_0, FlipFaceGS()));
        SetPixelShader(CompileShader(ps_4_0, PS()));
    }
}

【问题讨论】:

    标签: performance directx gpu cpu hlsl


    【解决方案1】:

    我认为关键字正在剔除,因为您的方法似乎旨在绕过它。

    不要将几何图形加倍,在这种情况下,剔除会移除不可见的一半,您应该简单地关闭剔除(设置D3D11_CULL_NONEdoc)并使用像素着色器输入语义SV_IsFrontFacedoc)来翻转如果需要,在您的像素着色器中正常。

    【讨论】:

    • 这可能会解决我所有的问题,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 2016-06-10
    • 2017-02-25
    • 1970-01-01
    相关资源
    最近更新 更多