DirectX剪辑空间纹理坐标

问题描述 投票:5回答:2

好的,我正在使用:

  • DirectX 10
  • C ++

好吧,这对我来说有点奇怪,我通常不会问这个问题,但是我被情况强迫了。我有两个全屏显示的三角形(由于我不想进入的原因,所以不是四边形!),它们通过不变形的事实与屏幕对齐。

在DirectX顶点声明中,我传递了3分量浮点数(Pos x,y,z)和2分量浮点数(Texcoord x,y)。 Texcoord z保留用于texture2d阵列,我目前在像素着色器中默认将其设置为0。

我写这是为了完成简单的任务:

float fStartX = -1.0f;
float fEndX = 1.0f;
float fStartY = 1.0f;
float fEndY = -1.0f;
float fStartU = 0.0f;
float fEndU = 1.0f;
float fStartV = 0.0f;
float fEndV = 1.0f;
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fStartY, 0, fEndU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fStartY, 0, fStartU, fStartV));
vmvUIVerts.push_back(CreateVertex(fEndX, fEndY, 0, fEndU, fEndV));
vmvUIVerts.push_back(CreateVertex(fStartX, fEndY, 0, fStartU, fEndV));

IA布局:(更新)

D3D10_INPUT_ELEMENT_DESC ieDesc[2] = {
    { "POSITION",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0,12, D3D10_INPUT_PER_VERTEX_DATA, 0 }
};

数据以以下格式到达顶点着色器:(Update)

struct VS_INPUT
{ 
    float3 fPos          :POSITION;
    float3 fTexcoord     :TEXCOORD0;
}

在我的Vertex和Pixel着色器中,对于此特定的绘制调用而言,发生的事情并不多,像素着色器使用指定的UV坐标从纹理中执行大部分工作采样。但是,这并没有达到预期的效果,似乎我正在获取采样纹理的[[仅1个像素。

解决方法是在像素着色器中执行以下操作:((更新)

sampler s0 : register(s0); Texture2DArray<float4> meshTex : register(t0); float4 psMain(in VS_OUTPUT vOut) : SV_TARGET { float4 Color; vOut.fTexcoord.z = 0; vOut.fTexcoord.x = vOut.fPosObj.x * 0.5f; vOut.fTexcoord.y = vOut.fPosObj.y * 0.5f; vOut.fTexcoord.x += 0.5f; vOut.fTexcoord.y += 0.5f; Color = quadTex.Sample(s0, vOut.fTexcoord); Color.a = 1.0f; return Color; }
还值得注意的是,这与着色器中定义的以下VS out结构一起使用:

struct VS_OUTPUT { float4 fPos :POSITION0; // SV_POSITION wont work in this case float3 fTexcoord :TEXCOORD0; }

现在我已经拉伸了纹理以适合整个屏幕,两个三角形已经覆盖了此纹理,但是为什么未按预期使用纹理UV?

为澄清起见,我正在使用点采样器,并尝试过夹紧和包裹UV。

我有点好奇,发现了上面提到的解决方案/解决方法,但是如果有人知道为什么会发生这种情况,我宁愿不必这样做。

c++ directx textures hlsl
2个回答
1
投票
您为顶点类型指定什么语义?它们是否与您的顶点以及着色器正确对齐?如果您使用的是D3DXVECTOR4,D3DXVECTOR3设置(如VS代码所示),则如果CreateVertex()返回D3DXVECTOR3,D3DXVECTOR2结构,则可能会出现问题。也可以放心地看到您的像素着色器代码。

1
投票
好吧,对于一个,超出0..1范围的纹理坐标将被钳位。我犯了一个错误,即假设通过将空间-1裁剪为+1,纹理坐标也是如此。并非如此,它们仍然从0.0变为1.0。
© www.soinside.com 2019 - 2024. All rights reserved.