簡體   English   中英

DirectX 11 曲面細分着色器不工作

[英]DirectX 11 Tesellation Shader Not Working

我的曲面細分着色器有問題。 它在我不使用Hull ShaderDomain Shader時渲染。 只是普通的頂點和像素着色器工作正常。 這是我的 VS 和 PS 着色器:

 VOut VShader(float4 position: POSITION, float4 color: COLOR) { VOut output; output.position = mul(world, position); output.color = color; return output; } float4 PShader(float4 position: SV_POSITION, float4 color: COLOR): SV_TARGET { return color; }

我正在使用正交投影到 map 將像素輸出到其原始位置。 這是有問題的着色器。 其中輸入float3頂點和float4 colors。

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); }

我的着色器初始化。 代碼:

D3DCompileFromFile(L"shader.hlsl", NULL, NULL, "VShader", "vs_5_0", 0, 0, &VS, &ERR);
D3DCompileFromFile(L"shader.hlsl", NULL, NULL, "PShader", "ps_5_0", 0, 0, &PS, &ERR); 
D3DCompileFromFile(L"shader.hlsl", NULL, NULL, "HShader", "hs_5_0", 0, 0, &HS, &ERR);
D3DCompileFromFile(L"shader.hlsl", NULL, NULL, "DShader", "ds_5_0", 0, 0, &DS, &ERR);

dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);
dev->CreateHullShader(HS->GetBufferPointer(), HS->GetBufferSize(), NULL, &pHS);
dev->CreateDomainShader(DS->GetBufferPointer(), DS->GetBufferSize(), NULL, &pDS);

devcon->VSSetShader(pVS, 0, 0);
devcon->HSSetShader(pHS, 0, 0);
devcon->DSSetShader(pDS, 0, 0);
devcon->PSSetShader(pPS, 0, 0);

輸入描述符:

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} };
}

緩沖區:

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); 

所有可能的異常都在此代碼中處理。 只是為了干凈的代碼,它們被刪除了 並且在InitRender階段沒有警告或異常。 我什至無法調試它,因為沒有任何東西被吸引到 output。 另外,有沒有辦法從着色器中查看 output 值?

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

不再由頂點着色器使用,而是由域着色器使用,但是,您似乎沒有附加它,因此您應該具有:

devcon->VSSetConstantBuffers(0, 1, &g_pConstantBuffer11); //Vertex
devcon->DSSetConstantBuffers(0, 1, &g_pConstantBuffer11); //Domain

(請注意,如果您只使用鑲嵌,通常不需要再綁定到頂點)。

否則管道將讀取零矩陣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM