Недопустимый входной шейдер

Я пытаюсь добавить вещи в мой рабочий код, но он возвращает ошибку [Invalid Arg] при вызове CreateInputLayout ().

Это работает до того, как я добавляю текстуру, но не получается, когда я ее добавляю.
Файл шейдера скомпилирован без ошибок.
Я думаю, что способ, которым я сделал макет, плох. Это правильно?

Структура вершины C ++:

struct VertexData{
XMFLOAT3 Pos;
XMFLOAT4 Color;
XMFLOAT2 TexCoord;
};

C ++ Layout:

    D3D11_INPUT_ELEMENT_DESC inputLayout[]={
{ "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 },
{ "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 28, D3D11_INPUT_PER_VERTEX_DATA, 0 },
}; uint lSize=sizeof(inputLayout)/sizeof(inputLayout[0]);

Код шейдера:

    // Stuff from DX Tutorial 7
Texture2D txDiffuse : register( t0 );
SamplerState samLinear : register( s0 );

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

struct VS_INPUT{
float4 pos : SV_POSITION;
float4 color : COLOR0;
float2 tex : TEXCOORD0;
};
struct PS_INPUT{
float4 pos : SV_POSITION;
float4 color : COLOR0;
float2 tex : TEXCOORD0;
};

PS_INPUT VS(VS_INPUT input){
PS_INPUT output=(PS_INPUT)0;

output.pos=mul(input.pos, World);
output.pos=mul(output.pos, View);
output.pos=mul(output.pos, Projection);

output.color = input.color;

output.tex = input.tex;

return output;
}

float4 PS(PS_INPUT input) : SV_Target {
return input.color;
}

Редактировать:

После нескольких попыток изменить код шейдера, я обнаружил, что если я изменю семантику …
первый положение для: float4 pos: ПОЗИЦИЯ;
второй положение для: float4 pos: SV_POSITION;
…входной макет успешно создан.

Я пробовал оба без префикса SV_ [системное значение], но это также не удалось. Я не знаю, почему я не могу сделать их такими же.

Семантика кажется немного волшебным. Не уверен, должен ли я ответить на свой вопрос Q или подождать, пока кто-нибудь умнее ответит лучше.

3

Решение

Ваши структуры не совпадают:

struct VertexData
{
XMFLOAT3 Pos;  // float3 here
XMFLOAT4 Color;
XMFLOAT2 TexCoord;
};

struct VS_INPUT{
float4 pos : SV_POSITION; // float4 here
float4 color : COLOR0;
float2 tex : TEXCOORD0;
};

Для позиционирования в 3D пространстве я предпочитаю использовать float3. Итак, как ваш входной макет:

"POSITION", 0, R32G32B32_FLOAT

О семантике магии:
Имена в HLSL должны совпадать с именами входного макета. Например:

Планировка:

{ "POSITION", 0, .. }

Вершинный шейдер:

float4 pos : POSITION0;

Единственным исключением является то, что пиксельный шейдер всегда должен иметь float4 pos : SV_POSITION семантика для позиции ввода пикселя (это один из System Всемантика).

И в качестве бонуса, некоторые часто используемые вещи, которые я хотел бы рекомендовать:

  • int size = ARRYSIZE(inputayoutDesc);
  • использование D3D11_APPEND_ALIGNED_ELEMENT вместо 12, 28 числа в качестве смещения выравнивания.
4

Другие решения

Входная семантика не должна быть SV_POSITION, если они находятся в ваших входных вершинах, они должны быть POSITION, я думаю.

Также вы заявляете это —

struct VS_INPUT{
float4 pos : SV_POSITION;

Разве это не должно быть float3 pos : POSITION;

Ваш входной макет имеет только 3 поплавка для этого элемента. Не уверен, что это проблема, но выглядит не совсем правильно.

0

По вопросам рекламы [email protected]