2012-11-06 66 views
1

我正在寻找的是一种简单的方法来获取通过像素着色器运行的每个像素的世界空间坐标。HLSL获得像素着色器的世界位置

我发现这个话题: Pixel World Position

,它似乎工作,但我还没有不是用来着色器语言,我完全地理解它。

难道没有简单的方法来解决这个问题吗?

亲切的问候, 马吕斯

回答

2

最简单的方法是从顶点着色器把它作为纹理坐标,就像这样(DX9样本容易,如果你用它来转换为10):

cbuffer cbmat : register(b0) 
{ 
    float4x4 tW; //World transform 
    float4x4 tWVP: //World * View * Projection 
}; 



struct vs2ps 
{ 
    float4 Pos : POSITION; 
    float4 TexCd : TEXCOORD0; 
float3 PosW : TEXCOORD1; 
}; 

vs2ps VS(float4 Pos : POSITION,float4 TexCd : TEXCOORD0) 
{ 
    vs2ps Out; 
    Out.Pos = mul(Pos, tWVP); 
    Out.TexCd = TexCd; 
Out.PosW = mul(Pos, tW); 
    return Out; 
} 

float4 PS(vs2ps In): COLOR 
{ 
    return float4(In.PosW,1.0f); 
} 
+0

能不要让这个运行。 float4x4 tVP:// World * View * Projection 实际上应该是tWVP,因为您只使用这个较低的值。 和Out.TexCd = mul(TexCd,tTex); tTex未定义。 无论如何thx。 – marius

+0

@marius更新了答案以删除tTex,并通过tWVP更改tVP。现在应该工作。 – catflier

+0

Thx的作品,但这真的是每个像素的世界位置?我认为这是顶点的位置吧?在pixelshader上输出它没有调试值^^。顺便说一句,我使用SM2.0/DX9和thx快速响应! – marius

相关问题