Xna 在同一像素着色器中采样多个纹理并渲染为多个纹理

Xna 在同一像素着色器中采样多个纹理并渲染为多个纹理,xna,hlsl,pixel-shader,Xna,Hlsl,Pixel Shader,我的总体目标是能够创建一个像素着色器,将多个纹理作为输入,并渲染到多个目标。 以及通过初始化和最终确定着色器,通过反复运行该着色器,我将得到我的结果 我以前创建过具有多个输入纹理的着色器,以及渲染到多个目标的着色器,但我从未将这两种材质组合在一起 我认为造成问题的原因是我对语义缺乏充分的理解,以及如何正确设置输入和输出纹理 我已经看到了几种不同的获取输入纹理的方法,对于如何设置它感到困惑 以下是init和itetrate着色器输出的共享结构的代码(Finalize着色器仅输出颜色): 结构分形输

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

我以前创建过具有多个输入纹理的着色器,以及渲染到多个目标的着色器,但我从未将这两种材质组合在一起

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

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

以下是init和itetrate着色器输出的共享结构的代码(Finalize着色器仅输出颜色): 结构分形输出 { float4 IterationsAndControl:COLOR0; 浮动4变量1和2:颜色1; float4变量3和4:COLOR2; };

以下是itterate和FINALIZE着色器的纹理声明(init着色器不使用任何纹理): 纹理2D迭代和控制; 采样器迭代与控制采样器:寄存器(s4) { 纹理=; };

纹理2d变量1和2; 取样器变量1和2取样器:寄存器(s5) { 纹理=; };

纹理2d变量3和4; 采样器变量3和4采样器:寄存器(s6) { 纹理=; };

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


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

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

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

GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[1] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[2] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[3] = SamplerState.PointClamp;
我的分形输出结构没有改变

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

#define DECLARE_TEXTURE(Name, index) \
Texture2D<float4> Name : register(t##index); \
sampler Name##Sampler : register(s##index);
然后在c#中,我以通常的方式设置渲染目标,像设置任何其他效果参数一样设置输入纹理

GraphicsDevice.SamplerStates[0] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[1] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[2] = SamplerState.PointClamp;
GraphicsDevice.SamplerStates[3] = SamplerState.PointClamp;
#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;