我的总体目标是能够创建一个像素着色器,它将多个纹理作为输入,并渲染到多个目标。 除了通过初始化和最终化着色器,通过重复运行此着色器,我将得到我的结果。
我之前创建了具有多个输入纹理的着色器,以及渲染到多个目标的着色器,但我从未组合过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(),然后绘制四边形(通过精灵)批次)。
任何帮助都会非常感激,因为我找不到任何做这样的事情的例子。
答案 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#中我以通常的方式设置渲染目标,设置我的输入纹理,因为我设置了任何其他效果参数。