2

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

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

我认为引起问题的是我对语义缺乏充分理解,以及如何正确设置输入和输出纹理。

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

下面是由 init 和 itterate 着色器输出的共享结构的代码(最终着色器只输出颜色):

结构FRACTAL_OUTPUT
{
    浮动4迭代和控制:颜色0;
    float4 变量 1And2 : COLOR1;
    float4 变量 3And4 : COLOR2;
};

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

Texture2D 迭代和控制;
采样器 IterationsAndControlSampler :寄存器(s4)
{
    纹理 = <IterationsAndControl>;
};

Texture2D 变量1和2; 采样器变量 1 和 2 采样器:寄存器(s5) { 纹理 = <IterationsAndControl>; };

Texture2D 变量3和4; 采样器Variables3And4Sampler:寄存器(s6) { 纹理 = <IterationsAndControl>; };

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

任何帮助将不胜感激,因为我找不到任何这样做的例子。

4

1 回答 1

2

对于其他感兴趣的人,我已经设法(通过大量的试验和错误!)让这个工作。

因为我在做数字运算,所以我将渲染目标格式设置为 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# 中,我以通常的方式设置渲染目标,设置我的输入纹理,就像我设置任何其他效果参数一样。

于 2011-03-31T09:13:55.957 回答