DX11 HLSL次要纹理坐标丢失

时间:2015-11-30 03:58:58

标签: delphi shader pascal directx-11 hlsl

用一会儿把我的头靠在墙上。尽管我认为我有一个用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 ...(对不起,它是pascal,但我喜欢pascal)

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 Struct

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

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

感谢任何见解。

1 个答案:

答案 0 :(得分:1)

回答我自己的问题。由于我一般都是Shaders的新手,也许这会帮助其他一些新手。

我假设我需要做的就是在顶点格式中添加第二组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

}