好的,首先我使用的是:
- DirectX 10
- C++
好吧,这对我来说有点奇怪,我通常不会问这个问题,但我是迫于环境。我有两个三角形(不是四边形,因为我不想进去!)全屏,通过它们没有转换的事实与屏幕对齐。
在DirectX顶点声明中,我传递一个3分量浮点(Pos x,y,z)和2分量浮点(Texcord x,y)Texcordz是为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 }
};
数据以以下格式到达顶点着色器:(更新)
struct VS_INPUT
{
float3 fPos :POSITION;
float3 fTexcoord :TEXCOORD0;
}
在我的"顶点和像素"着色器中,这个特定的绘制调用没有发生太多事情,像素着色器使用指定的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没有像预期的那样使用呢?
为了澄清,我使用了点采样器,并尝试了夹紧和包裹紫外线。
我有点好奇,找到了上面提到的解决方案/变通方法,但如果有人知道为什么会发生这种情况,我宁愿不必这么做?
您为顶点类型指定了什么语义?它们是否与顶点以及着色器正确对齐?如果您使用的是D3DXVECTOR4、D3DXVESTOR3设置(如VS代码中所示),如果CreateVertex()返回D3DXVECTOR3、D3DXVECTOR2结构,则可能会出现问题。看到你的像素着色器代码也会让人放心。
好吧,首先,0..1范围之外的纹理坐标会被钳制。我犯了一个错误,假设通过将空间-1剪裁到+1,纹理坐标也会是。事实并非如此,它们仍然从0.0变为1.0。
像素着色器中的代码之所以有效,是因为它使用剪辑空间x、y、z坐标来自动覆盖这些纹理坐标;我的疏忽。然而,像素着色器代码会导致全屏"四边形"上的纹理拉伸,因此它可能对某些地方的人有用;)