Я пытаюсь добавить вещи в мой рабочий код, но он возвращает ошибку [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 или подождать, пока кто-нибудь умнее ответит лучше.
Ваши структуры не совпадают:
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 числа в качестве смещения выравнивания.Входная семантика не должна быть SV_POSITION, если они находятся в ваших входных вершинах, они должны быть POSITION, я думаю.
Также вы заявляете это —
struct VS_INPUT{
float4 pos : SV_POSITION;
Разве это не должно быть float3 pos : POSITION;
Ваш входной макет имеет только 3 поплавка для этого элемента. Не уверен, что это проблема, но выглядит не совсем правильно.