HLSL几何着色器空输出

时间:2015-06-20 20:27:07

标签: directx directx-11 geometry-shader

我正在尝试在Geometry Shader中的单个顶点(作为POINT List)中构建纹理四边形。我现在无法解决的问题是没有任何东西得到渲染。我已经尝试使用Visual Studios'图形调试器,发现我的几何着色器的输出看起来是空的。

这是我的几何着色器:

struct PS_INPUT
{
    float4 position : SV_POSITION;
    float2 texCoord : TEXCOORD;
};

struct VS_OUTPUT
{
    float4 position : SV_POSITION;
    float3 normal : NORMAL;
};

[maxvertexcount(4)]
void GS(
    point VS_OUTPUT input[1], 
    inout TriangleStream< PS_INPUT > output
)
{
    float3 decalNormal = input[0].normal;
    float3 upVector = float3(0.0, 1.0f, 0.0f);
    float3 frontVector = 0.2f * decalNormal;
    // 2.0f = half-decal width
    float3 rightVector = normalize(cross(decalNormal, upVector)) * 4.0f;
    upVector = float3(0, 4.0f, 0);

    float3 vertices[4] = { { 1, 0, 0 }, { 0, 0, 1 }, { -1, 0, 0 }, { 0, 0, -1 } };
    vertices[0] = input[0].position.xyz - rightVector - upVector + frontVector; // Bottom Left
    vertices[1] = input[0].position.xyz + rightVector - upVector + frontVector; // Bottom Right
    vertices[2] = input[0].position.xyz - rightVector + upVector + frontVector; // Top Left
    vertices[3] = input[0].position.xyz + rightVector + upVector + frontVector; // Top Right

    float2 texCoord[4] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };
    texCoord[0] = float2(0, 1);
    texCoord[1] = float2(1, 1);
    texCoord[2] = float2(0, 0);
    texCoord[3] = float2(1, 0);

    PS_INPUT outputVert;
    for (uint i = 0; i < 4; i++)
    {
        outputVert.position = float4(vertices[i], 1.0f);
        outputVert.texCoord = texCoord[i];
        output.Append(outputVert);
    }
}

这是Draw调用的Pipeline阶段的屏幕截图。正如您所看到的那样,顶点着色器中存在3个像素,但在几何着色器之后没有任何内容。

pipelinestage draw call

我已经禁用所有剔除:

D3D11_RASTERIZER_DESC rDesc;
ZeroMemory(&rDesc, sizeof(D3D11_RASTERIZER_DESC));
rDesc.FillMode = D3D11_FILL_SOLID;
rDesc.CullMode = D3D11_CULL_NONE; // no culling for now...
rDesc.FrontCounterClockwise = false;
rDesc.DepthClipEnable = false;

深度测试:

dsDesc.DepthEnable = false;

设置这样的一切:

context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_POINTLIST);
context->RSSetState(m_pRasterizer);
context->IASetInputLayout(m_pInputLayout);
context->VSSetShader(m_pVS, 0, 0);
context->GSSetShader(m_pGS, 0, 0);
context->PSSetShader(m_pPS, 0, 0);

这可能是什么问题?我假设没有像素着色器,因为几何着色器不输出任何东西,是吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

我自己修理了它。我忘了将几何着色器中的顶点位置与我的视图投影矩阵相乘!