ОШИБКА ИСПОЛНЕНИЯ # 362: DEVICE_DRAW_POSITION_NOT_PRESENT - PullRequest
2 голосов
/ 14 января 2020

Я пытаюсь нарисовать куб в DirectX. Тем не менее, я получаю следующее сообщение об ошибке:

D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Rasterization Unit is enabled (PixelShader is not NULL or Depth/Stencil test is enabled and RasterizedStream is not D3D11_SO_NO_RASTERIZED_STREAM) but position is not provided by the last shader before the Rasterization Unit. [ EXECUTION ERROR #362: DEVICE_DRAW_POSITION_NOT_PRESENT]

Вот код для моих шейдеров;

cbuffer WorldBuffer : register (b0)
{
    matrix World;
    matrix View;
    matrix Projection;
}

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

VS_OUTPUT VS(float4 pos : POSITION, float4 color : COLOR) : VS_OUTPUT_SEMANTICS
{
    VS_OUTPUT output = (VS_OUTPUT)0;
    output.pos = mul(pos, World);
    output.pos = mul(output.pos, View);
    output.pos = mul(output.pos, Projection);
    output.color = color;
    return output;
}

float4 PS(VS_OUTPUT input : VS_OUTPUT_SEMANTICS) : SV_TARGET
{
    return input.color;
}

Поскольку я дал SV_POSITION semanti c VS_OUTPUT.pos Я думаю, что шейдер должен проходить позицию, но, похоже, он не работает. Как я могу исправить мои шейдеры?


Вот как я собираю свои шейдеры:

UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_SKIP_OPTIMIZATION | D3DCOMPILE_DEBUG;

r = D3DCompileFromFile(L"shader.fx", NULL, NULL, "VS", "vs_5_0", flags, 0, &vertex_blob, &errMsg);

1 Ответ

1 голос
/ 14 января 2020

При использовании:

VS_OUTPUT VS(float4 pos : POSITION, float4 color : COLOR) : VS_OUTPUT_SEMANTICS

VS_OUTPUT_SEMANTICS будет фактически переопределять семантику для каждого элемента, поэтому вместо вывода структуры, такой как:

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

, вы фактически выводите

struct VS_OUTPUT
{
    float4 pos   : VS_OUTPUT_SEMANTICS;
    float4 color : VS_OUTPUT_SEMANTICS;
};

Когда вы вызываете:

UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_SKIP_OPTIMIZATION | D3DCOMPILE_DEBUG;

r = D3DCompileFromFile(L"shader.fx", NULL, NULL, "VS", "vs_5_0", flags, 0, &vertex_blob, &errMsg);

Даже если шейдер компилируется, вы все равно должны смотреть в errMsg, так как компилятор может выдавать некоторые предупреждения (которые в этом случае будут):

"semantics in type overriden by variable/function or enclosing type"

Если также может быть хорошей идеей вызвать D3DDisassemble для полученного большого двоичного объекта, это может дать вам полученные данные отражения в текстовой форме.

В вашем случае вершинного шейдера вы будет иметь (только соответствующая часть):

// Input signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// POSITION                 0   xyzw        0     NONE   float   xyzw
// COLOR                    0   xyzw        1     NONE   float   xyzw
//
//
// Output signature:
//
// Name                 Index   Mask Register SysValue  Format   Used
// -------------------- ----- ------ -------- -------- ------- ------
// VS_OUTPUT_SEMANTICS      0   xyzw        0     NONE   float   xyzw
// VS_OUTPUT_SEMANTICS      1   xyzw        1     NONE   float   xyzw
//
...