HLSL从纹理位置获取值

时间:2012-10-22 07:08:50

标签: directx hlsl directx-9

我已将一些值映射到我的Alpha通道上的纹理中。实际上我将我的纹理用作2Darray。我需要的是一种在位置读取地图的alpha值的方法,例如[4] [5](代表x和y)

我需要在pixelhader中提供返回值。有没有办法做到这一点?

我使用DX9。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

你想在[4] [5](x,y)处使用texel作为整个像素分辨器吗? 如果这是你的问题,你可以预先确定坐标在顶点着色器上并沿着每个顶点传递,然后用那些紫外线进行采样。这样它就不会被插值。 (或者它会,但只有一个值可以插入)

除此之外,您可能需要更多地了解您想要实现的目标。 你用它做什么用的?什么时候会出现,你用它做什么样的网格?

答案 1 :(得分:0)

Texture2DArray是一个着色器模型4的东西。我不相信你在dx9上使用它。

如果您使用着色器模型4,则只需使用Load(4,5)功能。

否则,对于sm1,2,3,您可以输入所需的数字,例如: 4.0f和5.0作为普通的texcoord数据进入你的顶点。然后让像素着色器按照纹理的大小缩放它。

struct VertexInput {
    float4 pos : POSITION;
    float2 uv : TEXCOORD0; //0.0, 1.0, 2.0, 3.0, 4.0 etc
};

struct PixelInput {
    float4  position : POSITION;
    float2  uv : TEXCOORD0;
};

PixelInput vsTex(VertexInput vtx) 
{
    PixelInput output;
    float4 pos = vtx.pos;
    output.position = mul(pos, MatWorld);
    output.position = mul(output.position, MatView);
    output.position = mul(output.position, MatProj);

    output.uv = vtx.uv;

    return output;
}

float4 PixelShader(PixelInput input) : SV_Target
{
    float coords = pix.uv / float2(TEX_WIDTH, TEX_HEIGHT);
    return tex = tex2D(mySampler, coords);
}

TEX_WIDTH,TEX_HEIGHT通过D3DXCompileShader的'definitions'参数传入。并且

OR:只需在软件中执行4.0f / tex_width和5.0 / tex_height,然后传递该数字(在[0.0f,1.0f]到像素着色器之间)