Как использовать тесселяцию в Directx12?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать тесселяцию в Directx12?

Сообщение Anonymous »

Я использую DirectX12. Я хочу сделать тесселяцию для своего полигона, для этого я написал 2 простых шейдера:

Код: Выделить всё

struct Vertex{
float3 Position : POSITION;
float4 Color : COLOR;
};

struct tesOutput{
float edgeTessellationFactor[3] : SV_TessFactor;
float insideTessellationFactor : SV_InsideTessFactor;
};

tesOutput ConstantHS(InputPatch< Vertex, 3> patch, uint patchID : SV_PrimitiveID ){
tesOutput output;
output.edgeTessellationFactor[0] = 1.0f;
output.edgeTessellationFactor[1] = 1.0f;
output.edgeTessellationFactor[2] = 1.0f;
output.insideTessellationFactor = 1.0f;
return output;
}

[domain("tri")]
[partitioning("integer")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("ConstantHS")]
Vertex hull(InputPatch< Vertex, 3> patch, uint cPoint : SV_OutputControlPointID){
return patch[cPoint];
}

struct DomainOut{
float4 Position : SV_POSITION;
float4 Color : COLOR;
};

[domain("tri")]
DomainOut domain(OutputPatch< Vertex, 3> patch, tesOutput tessInput, float3 UVW : SV_DomainLocation ){
DomainOut output;

float4 _1=float4(patch[0].Position.xyz,1);
float4 _2=float4(patch[1].Position.xyz,1);
float4 _3=float4(patch[2].Position.xyz,1);
output.Position=_1 * UVW.x +
_2 * UVW.y +
_3 * UVW.z ;
output.Position=float4(output.Position.xyz, 1.0f);

output.Color = float4(1.0f, 0.0f, 1.0f, 1.0f);

return output;
}
вот мои против и PS:

Код: Выделить всё

struct vertex{
float3 pos : POSITION;
float4 color : COLOR;
};

vertex main(float3 position : POSITION, float4 color : COLOR) {
vertex output;
output.pos = position;
output.color = float4(1.0f, 0.0f, 1.0f, 1.0f);
return output;
}

struct VS_OUTPUT
{
float4 pos: SV_POSITION;
float4 color: COLOR;
};

float4 main(VS_OUTPUT input) : SV_TARGET
{
return input.color;
}
Чтобы понять причину, я максимально упростил шейдеры, даже не использую wvp-матрицу. Если я использую такой вершинный шейдер без тесселяции, полигон отображается

Код: Выделить всё

struct vertex{
float4 pos : SV_POSITION;
float4 color : COLOR;
};

vertex main(float3 position : POSITION, float4 color : COLOR) {
vertex output;
output.pos = float4(position, 1);
output.color = float4(1.0f, 0.0f, 1.0f, 1.0f);
return output;
}
если я использую hs и ds, экран пуст. Не понимаю почему, ведь они вообще ничего не делают, ведь параметры тесселяции 1.0f. Я просмотрел все примеры шейдеров, которые смог найти, и не вижу причин, по которым мои шейдеры не работают. Вот как я компилирую шейдеры:

Код: Выделить всё

D3DCompileFromFile(L"Shaders/VertexShader.hlsl", nullptr, nullptr, "main", "vs_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION, 0, &DX12.Shaders.vShader, &error)
D3DCompileFromFile(L"Shaders/TeselationShader.hlsl", nullptr, nullptr, "hull", "hs_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION, 0, &DX12.Shaders.hShader, &error)
D3DCompileFromFile(L"Shaders/TeselationShader.hlsl", nullptr, nullptr, "domain", "ds_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION, 0, &DX12.Shaders.dShader, &error)
D3DCompileFromFile(L"Shaders/ColorShader.hlsl", nullptr, nullptr, "main", "ps_5_0", D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION, 0, &DX12.Shaders.pShader, &error)
вот некоторые параметры конвейера, которые я изменил, чтобы установить hs и ds:

Код: Выделить всё

pipeLineDesc.VS={DX12.Shaders.vShader->GetBufferPointer(), DX12.Shaders.vShader->GetBufferSize()};
pipeLineDesc.PS={DX12.Shaders.cShader->GetBufferPointer(), DX12.Shaders.cShader->GetBufferSize()};
pipeLineDesc.HS={DX12.Shaders.hShader->GetBufferPointer(), DX12.Shaders.hShader->GetBufferSize()};
pipeLineDesc.DS={DX12.Shaders.dShader->GetBufferPointer(), DX12.Shaders.dShader->GetBufferSize()};
pipeLineDesc.IBStripCutValue = D3D12_INDEX_BUFFER_STRIP_CUT_VALUE_DISABLED;
pipeLineDesc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_PATCH ;
Я больше ничего не делал в DirectX. Возможно, мне нужно проделать дополнительную работу с DirectX, чтобы мои шейдеры заработали, или мои шейдеры написаны неправильно (я обрабатываю все ошибки, я просто пропустил это для краткости кода)

Подробнее здесь: https://stackoverflow.com/questions/783 ... -directx12
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Вопрос о синхронизации CPU/GPU DirectX12
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • Как сделать проходы рендеринга, чтобы графика работала параллельно с использованием DirectX12 и C++?
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous
  • DirectX12 вычислить пример шейдера
    Anonymous » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • DirectX12 вычислить вопрос о трубопроводе Шейдера
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • DirectX12 вычислить вопрос о трубопроводе Шейдера
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»