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( );}}
- RPG游戏中阻碍遮挡(XNA HLSL实现)
- RPG游戏中阻碍半透明遮挡(C# XNA)
- Silverlight 2.5D RPG游戏技巧与特效处理:(五)HLSL渲染动画
- 骑士进化论RPG游戏实现
- RPG游戏状态机实现实例
- XNA + HLSL 之小小心得
- 实现童年梦想——RPG游戏入门(RPG制作大师使用教程)
- XNA游戏:Hello XNA
- Silverlight 2.5D RPG游戏技巧与特效处理:HLSL渲染动画
- (转)AS3 RPG游戏引擎:理解分析RPG游戏
- RPG游戏(C++)代码
- RPG游戏制作(CSV)
- RPG游戏(地图传送)
- XNA中实现点阵化(马赛克)后处理效果
- AS3实现RPG游戏地图引擎
- Flash游戏开发-RPG地图实现
- AS3实现RPG游戏地图引擎
- HTML5 RPG游戏引擎 地图实现篇
- 工厂方法模式
- Unity播放视频(pc,android,ios) 。。整理。。
- 字符串清理
- 润乾报表V4.5在tomcat7下的部署
- java 单例对象同步
- RPG游戏中阻碍遮挡(XNA HLSL实现)
- Using INSTEAD OF triggers in SQL Server for DML operations
- Rookie零基础学java博客目录(不断更新)
- 内核级线程
- JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配
- [转]2012,写给24岁的自己
- Linux 常用命令——ls
- 使用javascript及servlet实现客户端和服务器端的表单验证
- 浅谈UML之交互图