Почему COLOR как выходной semanti c не поддерживается при нацеливании на ps_4_0, но поддерживается в vs_4_0? - PullRequest
0 голосов
/ 06 февраля 2020

Взять следующий код в качестве примера

struct vsout
{
  float4 pos : position;
  float4 clr : color;
};

cbuffer dmy : register(b0)
{
  float4x4 mat;
};

vsout vsmain(
  float4 pos : position,
  float2 tex : texcoord,
  float4 clr : color)
{
  vsout o;
  o.pos = mul(mat,pos);
  o.clr = clr;
  return o;
}

struct psout
{
  float4 clr : color;
};

psout psmain(
  float4 clr : color )
{
  psout o;
  o.clr = clr;
  return o;
}

fxc /Evsmain /Tvs_4_0 demo.hlsl, OK
fxc /Epsmain /Tps_4_0 demo.hlsl, FAILED
изменить psout на

struct psout
{
   float4 clr : sv_target;
};

fxc /Epsmain /Tps_4_0 demo.hlsl , OK
В соответствии с этим документом https://docs.microsoft.com/en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics COLOR является действительным семантием c для d3d9 и выше. fx c Я использую это D3DCOMPILER_47.dll. Как это произошло ? огромное спасибо!!!

1 Ответ

0 голосов
/ 08 февраля 2020

Вы строите без флага /Gec, поэтому компилятор HLSL не допускает поведение «обратной совместимости».

«COLOR» в случае вершинного шейдера - это вершина semanti c, которая в большинстве случаев являются «определяемой пользователем» семантикой.

«COLOR» также является допустимым «определяемым пользователем» семантикой c для привязки вывода Vertex Shader и ввода Pixel Shader.

Для строгого Совместимость: вы должны использовать SV_Target для вывода пиксельного шейдера.

В идеале вы также должны использовать SV_Position вместо Position для ввода Vertex Shader, но вы должны соответствовать тому, что вы указали в макет ввода. Все, что вы используете между VS и PS, также должно быть согласованным.

Если вы добавите /Gec в командную строку пиксельного шейдера, он будет построен, потому что он поддерживает более старый стиль Direct3D 9: fxc /Epsmain /Gec /Tps_4_0 demo.hlsl

См. Документы Microsoft

...