DX11 HLSL 二级纹理坐标丢失

DX11 HLSL Secondary Texture Coordinates Lost

有一段时间我一直在用这个把头撞在墙上。尽管我认为我有一个用 D3D11_INPUT_ELEMENT_DESC 定义的正确的顶点格式,但无论我做什么,我都看不到从这个着色器读取我的 TEXCOORD1 值。为了测试这个着色器,我将随机值放入我的第二组 UV 坐标中,只是为了查看它们是否到达着色器,但令我沮丧的是,我无法在任何地方找到这些随机值。我也看到数据直接进入映射内存,我很确定随机值在映射时就在那里。

这是着色器代码:

sampler ImageSampler: register(s0);
Texture2D <float4> ImageTexture: register(t0);
Texture2D <float4> ReflectionTexture: register(t1);
//Texture2D <float4> ReflectionMap: register(t0);

struct PS_IN
{
  float4 InPos: SV_POSITION;
  float2 InTex: TEXCOORD;
  float2 InRef: TEXCOORD1;
  float4 InCol: COLOR0;
};

float4 main(PS_IN input): SV_TARGET
{
  float4 res;
  float4 mul;
  float2 tcRef;

  float4 res1 = ImageTexture.Sample(ImageSampler, input.InTex) * input.InCol;
  float4 res2 = ReflectionTexture.Sample(ImageSampler, input.InRef+input.InTex);
  mul.r = 0.5;
  mul.g = 0.5;
  mul.b = 0.5;
  mul.a = 0.5;
  res = res1 + res2;
  res = res * mul;
  res.a = res1.a;

  res.r = input.InRef.x;//<-----should be filled with random stuff... not working
  res.b = input.InRef.y;//<-----should be filled with random stuff... not working

  return res;
}

这是我的 D3D11_ELEMENT_DESC...(抱歉,它是帕斯卡语言,但我喜欢帕斯卡语言)

const
  CanvasVertexLayout: array[0..3] of D3D11_INPUT_ELEMENT_DESC =
    ((SemanticName: 'POSITION';
    SemanticIndex: 0;
    Format: DXGI_FORMAT_R32G32_FLOAT;
    InputSlot: 0;
    AlignedByteOffset: 0;
    InputSlotClass: D3D11_INPUT_PER_VERTEX_DATA;
    InstanceDataStepRate: 0),

    (SemanticName: 'TEXCOORD';
    SemanticIndex: 0;
    Format: DXGI_FORMAT_R32G32_FLOAT;
    InputSlot: 0;
    AlignedByteOffset: 8;
    InputSlotClass: D3D11_INPUT_PER_VERTEX_DATA;
    InstanceDataStepRate: 0),

    (SemanticName: 'TEXCOORD';
    SemanticIndex: 1;
    Format: DXGI_FORMAT_R32G32_FLOAT;
    InputSlot: 0;
    AlignedByteOffset: 16;
    InputSlotClass: D3D11_INPUT_PER_VERTEX_DATA;
    InstanceDataStepRate: 0),

    (SemanticName: 'COLOR';
    SemanticIndex: 0;
    Format: DXGI_FORMAT_R8G8B8A8_UNORM;
    InputSlot: 0;
    AlignedByteOffset: 24;
    InputSlotClass: D3D11_INPUT_PER_VERTEX_DATA;
    InstanceDataStepRate: 0)
    );

这是 Vertext 结构

TVertexEntry = packed record
  X, Y: Single;
  U, V: Single;
  u2,v2:single;
  Color: LongWord;
end;

由于 COLOR 语义遵循 TEXTURE 语义,我最好的猜测是问题出在 SHADER 而不是 pascal 代码......但由于我是这类东西的新手,我显然迷路了

如有任何见解,我们将不胜感激。

回答我自己的问题。由于我一般是着色器的新手,也许这会对其他一些新手有所帮助。

我假设我需要做的就是将第二组 UV 坐标添加到顶点格式并为其添加 D3D11_INPUT_ELEMENT_DESC。但是,还涉及一个顶点着色器,或多或少是一个直通,并且该顶点着色器需要知道新的 UV 坐标并让它们通过。我只是在制作一个 2D 引擎,所以我不认为我什至需要弄乱 VertexShaders ......去看看吧。所以我修改了顶点着色器,结果是这样的:

void main(
  float2 InPos: POSITION0,
  float2 InTex: TEXCOORD0,
  float2 InTex2: TEXCOORD1,//<--added
  float4 InCol: COLOR0,
  out float4 OutPos: SV_POSITION,
  out float2 OutTex: TEXCOORD2,
  out float2 OutTex2: TEXCOORD3,//<--added
  out float4 OutCol: COLOR0)
{
  OutPos = float4(InPos, 0.0, 1.0);
  OutTex = InTex;
  OutCol = InCol;
  OutTex2 = InTex2;//<--added

}