Xna 如何在纹理上使用着色器?
我想建立一个基于着色器的照明系统。http://stackoverflow.com/editing-help 为此,我需要对纹理应用某些函数。 如何通过C#/XNA中的着色器算法传递纹理? 我试着这样做:Xna 如何在纹理上使用着色器?,xna,hlsl,lighting,Xna,Hlsl,Lighting,我想建立一个基于着色器的照明系统。http://stackoverflow.com/editing-help 为此,我需要对纹理应用某些函数。 如何通过C#/XNA中的着色器算法传递纹理? 我试着这样做: foreach (EffectPass pass in effect.Techniques[0].Passes) { pass.Apply(); } spriteBatch.Draw(shadowmap,
foreach (EffectPass pass in effect.Techniques[0].Passes)
{
pass.Apply();
}
spriteBatch.Draw(shadowmap,
new Rectangle(0, 0, range * 2, range * 2),
new Rectangle((int)screenPos.X - range, (int)screenPos.Y - range, 2 * range, 2 * range),
Color.White);
但它不起作用。
我也试过:
spriteBatch.Begin();
spriteBatch.Draw(shadowmap,
new Rectangle(0, 0, range * 2, range * 2),
new Rectangle((int)screenPos.X - range, (int)screenPos.Y - range, 2 * range, 2 * range),
Color.White);
spriteBatch.End();
graphicsDevice.SetRenderTarget(null);
effect.Parameters["tex"].SetValue(area);
foreach (EffectPass pass in effect.Techniques[0].Passes)
{
pass.Apply();
}
但这也无济于事。
我需要通过两个/三个算法过程来传递纹理,所以我需要一种方法来任意地将着色器应用到纹理。有什么方法可以做到这一点吗
编辑:
HLSL代码如下所示:
texture tex;
sampler input : tex;
float red;
float2 mousepos;
float4 PixelShaderFunction(float2 coords: TEXCOORD0) : COLOR0
{
float4 color;
color=tex2D(input,coords.xy);
color.r=0.9;
return color;
}
technique Technique1
{
pass Pass1
{
PixelShader = compile ps_2_0 PixelShaderFunction();
}
}
您可以将
效果
传递给
在调用SpriteBatch.Draw
之前,还可以使用SpriteSortMode.Immediate
和Apply()
不同的效果
(在所有其他模式下,SpriteBatch
将批量执行其所有操作(设置效果和绘图),直到您调用End
。这会提供更好的性能,但不会给您在精灵之间设置新效果或状态的机会。)
如果您直接使用效果(而不是通过
SpriteBatch
),则可以在图形设备上设置纹理,如下所示:
GraphicsDevice.Texture[0] = myTexture;
另外Apply()
设置效果,设置任何其他图形设备状态,然后调用GraphicsDevice.Draw*()
方法之一
请注意
foreach
循环中的错误。每次调用Apply()
(即:在循环中)后,必须绘制一些内容。如果将效果传递给SpriteBatch.Begin
,则不需要循环,因为SpriteBatch
将在内部为您处理该效果。您似乎发布了错误的链接。你可以编辑你的帖子或将其添加为评论吗?我尝试了你的解决方案,但仍然无效。我无法将其设置为纹理,因为它是渲染目标。我需要做的是基本上获取纹理,然后对其进行变换。在对其运行两个算法之前,我不会绘制它。我将尝试使用两个渲染目标并将输出从一个渲染到另一个。一个RenderTarget2D
是一个Texture2D
。你可以这样使用它。唯一的限制条件是,在将其设置为渲染目标时,不能将其用作纹理。在将其用作纹理之前,请使用SetRenderTarget(null)
——不过,看起来您已经在这样做了?正如您所建议的那样,使用多个目标实现多重传递效果是正确的解决方案。