RPG游戏中阻碍遮挡(XNA HLSL实现)

来源:互联网 发布:手机怎么做淘宝客推广 编辑:程序博客网 时间:2024/06/06 01:41

昨天用C#代码实现了 《梦幻西游》中的阻碍半透明效果,今天使用了hlsl的像素差色器实现了这种效果,但更加完美。在用HLSL之前本身想放弃使用的了,因为一来自己对HLSL不熟悉,二来用HLSL实现起来有点麻烦,最重要的就是担心性能,因为像素着色器处理的是一个像素,不过上网搜了下,着色器的处理速度很快,因为是并行计算,不像使用代码那样(循环处理),所是速度超快!!!

下面是代码

//C#代码

 private void ShaderAlphaTree()        {            m_effectMaskByTree.CurrentTechnique = m_effectMaskByTree.Techniques["MaskByTree"];            m_effectMaskByTree.Parameters["spriteWidth"].SetValue((float)m_textMHXYPlayer.Width);            m_effectMaskByTree.Parameters["spriteHeight"].SetValue((float)m_textMHXYPlayer.Height);            m_effectMaskByTree.Parameters["treeWidth"].SetValue((float)m_textTree.Width);            m_effectMaskByTree.Parameters["treeHeight"].SetValue((float)m_textTree.Height);            m_effectMaskByTree.Parameters["treePos"].SetValue(m_vecTree);            m_effectMaskByTree.Parameters["maskTexture"].SetValue(m_textTree);            m_effectMaskByTree.Parameters["spritePos"].SetValue(m_vecPlayer);            // TODO: Add your drawing code here            spriteBatch.Begin();            spriteBatch.Draw(m_textTreeBg, m_vecTree, Color.White);            spriteBatch.Draw(m_textTree, m_vecTree, Color.White);            spriteBatch.End();            spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend);            foreach (EffectPass pass in m_effectMaskByTree.CurrentTechnique.Passes)            {                pass.Apply();                spriteBatch.Draw(m_textMHXYPlayer, m_vecPlayer, Color.White);            }            spriteBatch.End();        }


//HLSL代码

float2 spritePos;float2 treePos;float spriteWidth;float spriteHeight;float treeWidth;float treeHeight;Texture xColoredTexture;sampler ColoredTextureSampler = sampler_state{ texture = <xColoredTexture> ;magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR;AddressU = mirror; AddressV = mirror;};Texture maskTexture;sampler MaskTextureSampler = sampler_state{ texture = <maskTexture> ;magfilter = LINEAR; minfilter = LINEAR; mipfilter=LINEAR;AddressU = mirror; AddressV = mirror;};struct VertexIn{float4 position : POSITION;float2 textureCoordinates : TEXCOORD0;};struct VertexOut{float4 Position : POSITION;float2 textureCoordinates : TEXCOORD0;};float4 PixelShaderFunction(VertexOut input) : COLOR0{float4 Color;Color = tex2D(ColoredTextureSampler, input.textureCoordinates.xy);float pixelCoorX = input.textureCoordinates.x * spriteWidth + spritePos.x;float pixelCoorY = input.textureCoordinates.y * spriteHeight + spritePos.y;float distFromTreeX = pixelCoorX - treePos.x;float distFromTreeY = pixelCoorY - treePos.y;if (distFromTreeX > 0 && distFromTreeX < treeWidth&& distFromTreeY > 0 && distFromTreeY < treeHeight){float treeTextCoorX = distFromTreeX / treeWidth;float treeTextCoorY = distFromTreeY / treeHeight;float4 colorTree = tex2D(MaskTextureSampler, float2(treeTextCoorX,treeTextCoorY));if (Color.a > 0 && colorTree.a > 0){Color.a = 0.5;}}return Color;}technique MaskByTree{pass Pass0{AlphaBlendEnable = True;SrcBlend = SrcAlpha;DestBlend = InvSrcAlpha; //VertexShader = compile vs_2_0 VertexShaderFunction( );PixelShader = compile ps_2_0 PixelShaderFunction( );}}

原创粉丝点击