C++ DirectX 11细分着色器不工作

C++ DirectX 11细分着色器不工作,c++,directx-11,hlsl,C++,Directx 11,Hlsl,我的细分着色器有问题。当我不使用外壳着色器或域着色器时,它会渲染。只需使用普通顶点和像素着色器即可。以下是我的VS和PS着色器: 我使用正交投影将像素映射到其原始位置。这里是有问题的着色器。它输入float3顶点和float4颜色 cbuffer cbPerFrame : register(b0) { matrix world; }; struct VS_CONTROL_POINT_INPUT { float3 vPosition : POSITION; };

我的细分着色器有问题。当我不使用
外壳着色器
域着色器
时,它会渲染。只需使用普通顶点和像素着色器即可。以下是我的VS和PS着色器:

我使用正交投影将像素映射到其原始位置。这里是有问题的着色器。它输入
float3
顶点和
float4
颜色

cbuffer cbPerFrame : register(b0) {
    matrix world; };

struct VS_CONTROL_POINT_INPUT {
    float3 vPosition        : POSITION; };

struct VS_CONTROL_POINT_OUTPUT {
    float3 vPosition        : POSITION; };

struct HS_CONSTANT_DATA_OUTPUT {
    float Edges[3]          : SV_TessFactor;
    float Inside            : SV_InsideTessFactor; };

struct HS_OUTPUT {
    float3 vPosition           : POSITION; };

HS_CONSTANT_DATA_OUTPUT ConstantHS(InputPatch<VS_CONTROL_POINT_OUTPUT, 3> ip,uint PatchID : SV_PrimitiveID) {
    HS_CONSTANT_DATA_OUTPUT Output;
    Output.Edges[0] = Output.Edges[1] = Output.Edges[2] = 4;
    Output.Inside = 4;
    return Output; }

   [domain("tri")]
   [partitioning("integer")]
   [outputtopology("triangle_cw")]
   [outputcontrolpoints(3)]
   [patchconstantfunc("ConstantHS")]

HS_OUTPUT HShader(InputPatch<VS_CONTROL_POINT_OUTPUT, 3> p, uint i : SV_OutputControlPointID, uint PatchID : SV_PrimitiveID)

 {
        HS_OUTPUT Output;
        Output.vPosition = p[i].vPosition;
        return Output;
 }

struct DS_OUTPUT {
    float4 vPosition        : SV_POSITION; };

[domain("tri")]
 DS_OUTPUT DShader(HS_CONSTANT_DATA_OUTPUT input, float3 UVW : SV_DomainLocation, const OutputPatch<HS_OUTPUT, 3> quad) {
        DS_OUTPUT Output;
        float3 finalPos = UVW.x * quad[0].vPosition + UVW.y * quad[1].vPosition + UVW.z * quad[2].vPosition;
        Output.vPosition = mul(world,float4(finalPos, 1));
        return Output; }

VS_CONTROL_POINT_OUTPUT VShader(VS_CONTROL_POINT_INPUT Input) {
    VS_CONTROL_POINT_OUTPUT Output;
    Output.vPosition = Input.vPosition;
    return Output; }

float4 PShader(DS_OUTPUT Input) : SV_TARGET {
    return float4(1, 0, 0, 1); }
输入描述符:

D3D11_INPUT_ELEMENT_DESC ied[] =
{
    {"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
    {"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
};

dev->CreateInputLayout(ied, 2, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout);
devcon->IASetInputLayout(pLayout);
光栅化器:

D3D11_RASTERIZER_DESC RasterDesc = {};
RasterDesc.FillMode = D3D11_FILL_SOLID;
RasterDesc.CullMode = D3D11_CULL_NONE;
RasterDesc.DepthClipEnable = TRUE;
ID3D11RasterizerState* WireFrame=NULL;

dev->CreateRasterizerState(&RasterDesc, &WireFrame);
devcon->RSSetState(WireFrame);
输入顶点:

OurVertices = (VERTEX*)malloc(PointCount * sizeof(VERTEX));
for (int i = 0; i < PointCount; i++)
{
    OurVertices[i] = { RandOm() * i,RandOm() * i ,RandOm() ,{abs(RandOm()),abs(RandOm()),abs(RandOm()),1.0f} };
}
渲染时:

devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST); 
所有可能的异常都在这段代码中处理。只是为了干净的代码,它们被删除了。在
Init
Render
阶段没有警告或异常。
我甚至不能调试它,因为没有任何东西被绘制到输出。还有,是否有任何方法可以查看着色器的输出值?

您应该查看细分样本,然后。我将再次查看,但我对这些样本的解决方案没有希望。无论如何,非常感谢@查克沃尔伯恩
OurVertices = (VERTEX*)malloc(PointCount * sizeof(VERTEX));
for (int i = 0; i < PointCount; i++)
{
    OurVertices[i] = { RandOm() * i,RandOm() * i ,RandOm() ,{abs(RandOm()),abs(RandOm()),abs(RandOm()),1.0f} };
}
ID3D11Buffer* g_pConstantBuffer11 = NULL;
cbuff.world = XMMatrixOrthographicOffCenterLH(SceneY - (ViewPortWidth / 2) * SceneZoom, SceneY + (ViewPortWidth / 2) * SceneZoom,
    SceneX - (ViewPortHeight / 2) * SceneZoom, SceneX + (ViewPortHeight / 2) * SceneZoom,-10000.0f, 10000.0f);

D3D11_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof(CBUFFER);
cbDesc.Usage = D3D11_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
cbDesc.StructureByteStride = 0;
   
D3D11_SUBRESOURCE_DATA InitData;
InitData.pSysMem = &cbuff;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;

dev->CreateBuffer(&cbDesc, &InitData,&g_pConstantBuffer11);

devcon->VSSetConstantBuffers(0, 1, &g_pConstantBuffer11);
devcon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST);