对多个纹理进行采样并渲染到同一像素着色器中的多个纹理

时间:2011-03-30 11:25:15

标签: xna hlsl pixel-shader

我的总体目标是能够创建一个像素着色器,它将多个纹理作为输入,并渲染到多个目标。 除了通过初始化和最终化着色器,通过重复运行此着色器,我将得到我的结果。

我之前创建了具有多个输入纹理的着色器,以及渲染到多个目标的着色器,但我从未组合过2。

我相信导致问题的是我缺乏对语义的全面理解,以及如何正确设置输入和输出纹理。

我已经看到了几种不同的获取输入纹理的方法,并且对它应该如何设置感到困惑。

下面是init和itterate着色器输出的共享结构的代码(finalize着色器只输出一种颜色):

struct FRACTAL_OUTPUT
{
    float4 IterationsAndControl : COLOR0;
    float4 Variables1And2 : COLOR1;
    float4 Variables3And4 : COLOR2;
};

下面是itterate和finalize着色器的纹理声明(init着色器不使用任何纹理):

Texture2D IterationsAndControl;
sampler IterationsAndControlSampler : register(s4)
{
    Texture = <IterationsAndControl>;
};

Texture2D Variables1And2; sampler Variables1And2Sampler : register(s5) { Texture = <IterationsAndControl>; };

Texture2D Variables3And4; sampler Variables3And4Sampler : register(s6) { Texture = <IterationsAndControl>; };

在c#XNA代码中,我设置渲染目标(通过执行GraphicsDevice.SetRenderTargets()然后设置纹理参数(通过执行Effect.Parameter [“TextureVariableName”]。SetValue(),然后绘制四边形(通过精灵)批次)。

任何帮助都会非常感激,因为我找不到任何做这样的事情的例子。

1 个答案:

答案 0 :(得分:1)

对于其他感兴趣的人,我已经设法(通过大量的试验和错误!)来实现这一目标。

由于我正在进行数字运算,我将渲染目标格式设置为Vector4(我以前使用的rgba64似乎不起作用)。 因为我现在使用矢量格式,我还必须将设备采样器更改为SamplerState.Point:

GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[1] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[2] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[3] = SamplerState.PointClamp;

我的FRACTAL_OUTPUT结构没有改变。

改变的是采样器。我正在使用XNA效果采样器中定义的宏:

#define DECLARE_TEXTURE(Name, index) \
Texture2D<float4> Name : register(t##index); \
sampler Name##Sampler : register(s##index);

然后,为了对多个纹理进行采样,我正在执行以下操作:

DECLARE_TEXTURE(IterationsAndControl, 1);
....
return tex2D(IterationsAndControlSampler, texCoord).x;

然后在c#中我以通常的方式设置渲染目标,设置我的输入纹理,因为我设置了任何其他效果参数。