2012-02-23 102 views
5

好先上去,我使用:的DirectX剪辑空间纹理坐标

  • 的DirectX 10
  • C++

好吧,这是一个有点古怪的一个对我来说,我通常不会问这个问题,但我被情况所迫。我有两个三角形(不是四方,因为我不会进入!)全屏幕,通过它们未被转换的事实对齐屏幕。

在DirectX顶点声明中,我传递了3分量的float(Pos x,y,z)和2分量的float(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 } 
}; 

数据达到了以下格式的顶点着色器:(更新)

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出来的着色器结构定义:

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

现在我有一个拉伸到适合整个屏幕的纹理,这两个三角形已经覆盖了这个,但为什么纹理UV没有像预期的那样被使用?

澄清我正在使用一个点采样器,并尝试了夹钳和包裹紫外线。

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

回答

1

好吧,其中之一,0..1范围外的纹理坐标会被钳位。我犯了一个错误,假设通过将空间-1剪切到+1来表示纹理坐标也是如此。事实并非如此,他们仍然从0.0到1.0。

像素着色器中的代码工作的原因是因为它使用了剪辑空间x,y,z坐标来自动覆盖这些纹理坐标;我的一个疏忽。然而,像素着色器代码导致在全屏“四边形”上进行纹理拉伸,所以它可能对某个人有用;)

1

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

+0

更新的问题,不太明白它是如何相关的,它不是像我一直没有在这个环境中工作很长一段时间。 – Jay 2012-02-24 10:55:27

+0

CreateVertex没有什么特别的,返回我想要的。唯一可能不同的是texcoord Z未被使用,并且在未来被留下使用纹理阵列。 – Jay 2012-02-24 11:00:32

+0

对齐是正确的,跨步是正确的值24字节,(不是16字节的好倍数,但它应该仍然工作,因为dx自动填充这个) – Jay 2012-02-24 11:03:57