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
}
有一段时间我一直在用这个把头撞在墙上。尽管我认为我有一个用 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
}