c# - SharpDX Pixel shaders need different parameters for different SpriteBatches vs DrawQuad. Fixable? -
i'm new building graphics engines , kinda stumped on particular issue.
i have issue getting pixel shaders work using same set of parameters both. causing me have create 2 different techniques each method. if try use same parameters both, 1 of them return nothing.
my goal use 1 set of parameters shader, eliminating sprite specific version of each technique use.
here have do:
hlsl pixel shader
texture2d texture : register(t0); samplerstate texturesampler : register(s0); texture2d texturealpha; cbuffer projectionmatrix : register(b0) { row_major float4x4 matrixtransform : packoffset(c0); }; void vs( inout float4 color : color0, inout float2 texcoord : texcoord0, inout float4 position : sv_position) { position = mul(position, matrixtransform); } //method required using drawquad float4 ps( float2 tex : texcoord0 ) : sv_target { float3 tcolor = texture.sample(texturesampler, tex).rgb * texturealpha.sample(texturesampler, tex).a; float alpha = texturealpha.sample(texturesampler, tex).a * texture.sample(texturesampler, tex); return float4(tcolor, alpha); } //method required using in spritebatches float4 pssprite( float4 color : color0, float2 tex : texcoord0 ) : sv_target { return ps(tex); } technique masksprite { pass { profile = 9.3; //sprite's require vs set well. vertexshader = compile vs_4_0_level_9_1 vs(); pixelshader = compile ps_4_0_level_9_1 pssprite(); } } technique mask { pass { profile = 9.3; pixelshader = compile ps_4_0_level_9_1 ps(); } }
loadcontent() code
protected override void loadcontent() { //... //render target mask var backdesc = graphicsdevice.backbuffer.description; rendertargetmask = todisposecontent(rendertarget2d.new(graphicsdevice, backdesc.width, backdesc.height, 1, backdesc.format)); //sprite batch initialization spritebatch = todisposecontent(new spritebatch(graphicsdevice)); //load in fx , textures ballstexture = content.load<texture2d>("balls"); alphamaptexture= content.load<texture2d>("alphamap"); maskeffect = content.load<effect>("mask"); //... }
spritebatch code
protected override void draw(gametime gametime) { //... maskeffect.currenttechnique = bloomeffect.techniques["masksprite"]; maskeffect.parameters["destination"].setresource(alphamaptexture); //texture2d spritebatch.begin( spritesortmode.deferred, graphicsdevice.blendstates.nonpremultiplied, null, null, null, maskeffect); spritebatch.draw( ballstexture, //texture2d new vector2(10, 10), new rectangle(0, 0, ballsdesttexture.width, ballsdesttexture.height), color.white, 0.0f, new vector2(0, 0), vector2.one, spriteeffects.none, 0f); spritebatch.end(); //... }
draw quad code
protected override void draw(gametime gametime) { //draw stuff rendertargetmask //... maskeffect.currenttechnique = maskeffect.techniques["mask"]; maskeffect.parameters["texture"].setresource(rendertargetmask); maskeffect.parameters["texturealpha"].setresource(ballsdesttexture); maskeffect.parameters["texturesampler"] .setresource(graphicsdevice.samplerstates.pointclamp); var pquad = new primitivequad(graphicsdevice); pquad.draw(maskeffect.currenttechnique.passes[0]); //... }
Comments
Post a Comment