Bonjour à tous,
je reviens vers vous avec des soucis de pixel shader;
mon idée est de pouvoir traiter une Surface par un simple pixel shader (ici par exemple ne conserver que la composante rouge de la surface), le tout en c#/mdx1.1 (pas encore envie de passer à xna, seulement quand j’aurais un truc qui me convienne, et pour l’instant je fais tout ce que je veux avec cet environnement).
Mon idée est la suivante (et je ne sais même pas si c’est faisable, notez).
Le code du shader, simple, voire minimaliste (trop ?):
[code]texture g_workingTexture;
sampler g_2DSrc = sampler_state
{
Texture = <g_workingTexture>;
};
float4 RedExtractionShader( float2 Tex : TEXCOORD0 ) : COLOR0
{
float4 Color;
Color = tex2D( g_2DSrc, Tex.xy);
Color.g = 0;
Color.b = 0;
return Color;
}
technique RedPostProcess
{
pass p0
{
VertexShader = null;
PixelShader = compile ps_2_0 RedExtractionShader();
}
}[/code]
Mon code d’appel au shader:
[code]Texture mWorkingTexture;
Surface mWorkingSurface;
SurfaceDescription lSDC = mBackbufferColor.Description;
mWorkingTexture = new Texture(mDevice, lSDC.Width, lSDC.Height, 0, Usage.None, lSDC.Format, Pool.Managed);
mWorkingSurface = mWorkingTexture.GetSurfaceLevel(0);
// j’initialisie ici ma surface à pixelshaderiser, venant de mon backbuffer
SurfaceLoader.FromSurface(mWorkingSurface, mBackbufferColor, Filter.None, 0);
mDOF.SetValue(“g_workingTexture”, mWorkingTexture);
mDOF.Technique = “RedPostProcess”;
numpasses = mDOF.Begin(0);
for (int lPasse = 0; lPasse < numpasses; lPasse++)
{
mDOF.BeginPass(lPasse);
mDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, 1);
mDOF.EndPass();
}
mDOF.End();
// Mon image sauvée sur disque est la même qu’affichée en entrée …
TextureLoader.Save(“h:\test.bmp”, ImageFileFormat.Bmp, mWorkingTexture);[/code]
Quelqu’un aurait-il un idée ?
J’ai googlé pas mal, sans trouver comment faire ce genre de trucs …
Merci , alt3.