公告板技术是3D游戏中用的非常多的一种技术,主要是用于控制场景中的Texture的方向,让他始终以一定的角度对着我们的镜头(一般是垂直于镜头)。
如我们在3D游戏中看到的怪物的蓝、红和怪物名字、一些花草树木等,无论我们在哪个方向看它总是对着我们。
如下图所示:

      

GraphicsDeviceManager graphics;
Texture2D texRedPanda;//镜头信息参数
Vector3 pos, lookat, up;
//World,View,Project矩阵
Matrix world,view, project;
BasicEffect basicEffect;
//顶点结构
VertexPositionTexture[] vpt;
VertexDeclaration vertexDec;public GameMain()
{graphics = new GraphicsDeviceManager(this);Content.RootDirectory = "Content";
}protected override void Initialize()
{//初始化镜头信息pos = new Vector3(0, 0,200);lookat = Vector3.Zero;up = Vector3.Up;//初始化变换矩阵world = Matrix.Identity;bbWorld = Matrix.Identity;view = Matrix.CreateLookAt(pos, lookat, up);project = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, 800f/600f, 1, 1000);vpt = new VertexPositionTexture[6];GraphicsDevice.RenderState.CullMode = CullMode.None;base.Initialize();
}protected override void LoadContent()
{texRedPanda = Content.Load<Texture2D>("RedPanda");basicEffect = new BasicEffect(GraphicsDevice, null);vertexDec = new VertexDeclaration(GraphicsDevice, VertexPositionTexture.VertexElements);//定义三角形的各顶点坐标和纹理坐标vpt[0] = new VertexPositionTexture(new Vector3(-25,-25, 0), new Vector2(0, 1));vpt[1] = new VertexPositionTexture(new Vector3(-25, 25, 0), new Vector2(0, 0));vpt[2] = new VertexPositionTexture(new Vector3(25,-25, 0), new Vector2(1, 1));vpt[3] = new VertexPositionTexture(new Vector3(-25, 25, 0), new Vector2(0, 0));vpt[4] = new VertexPositionTexture(new Vector3(25, 25, 0), new Vector2(1, 0));vpt[5] = new VertexPositionTexture(new Vector3(25,-25, 0), new Vector2(1, 1));
}protected override void Update(GameTime gameTime)
{// Allows the game to exitif (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)this.Exit();base.Update(gameTime);
}protected override void Draw(GameTime gameTime)
{GraphicsDevice.Clear(Color.Black);//设置变换矩阵参数basicEffect.World = world;basicEffect.View = view;basicEffect.Projection = project;//设置绘制纹理basicEffect.TextureEnabled = true;basicEffect.Texture = texRedPanda;basicEffect.Begin();foreach (var pass in basicEffect.CurrentTechnique.Passes){pass.Begin();GraphicsDevice.VertexDeclaration = vertexDec;GraphicsDevice.DrawUserPrimitives<VertexPositionTexture>(PrimitiveType.TriangleList, vpt,0, 2);pass.End();}basicEffect.End();base.Draw(gameTime);
}

texRedPanda的位置大概是在坐标原点,为了等会便于观察,将在Update加些内容。让镜头的位置通过键盘控制绕原点旋转(这里不是用World变换)。这里是在网上找的公式:
    x1 = x0 * cosB + y0 * sinB
    y1 = -x0 * sinB + y0 * cosB
 
       x0,y0表示镜头现在的位置,y1,y2表示绕原点旋转B弧度后的坐标。
       现在我们就呆以看到没有使用公告板技术时的效果了。把下面的代码加到Update方法的里:

float x0, z0;
x0=pos.X;
z0=pos.Z;
if (Keyboard.GetState().IsKeyDown(Keys.Left))
{pos.X = x0 * (float)Math.Cos(0.1d) + z0 * (float)Math.Sin(0.1d);pos.Z = (-x0) * (float)Math.Sin(0.1d) + z0 * (float)Math.Cos(0.1d);
}
if (Keyboard.GetState().IsKeyDown(Keys.Right))
{pos.X = x0 * (float)Math.Cos(-0.1d) + z0 * (float)Math.Sin(-0.1d);pos.Z = (-x0) * (float)Math.Sin(-0.1d) + z0 * (float)Math.Cos(-0.1d);
}
view = Matrix.CreateLookAt(pos, Vector3.Zero, Vector3.Up);//将视点 位置显示在标题栏
Window.Title = pos.ToString();

下面我们加一个用了公告板的World变换。主要代码如下,
    bbWorld = Matrix.CreateBillboard(Vector3.Zero, -pos, Vector3.Up, null);
       现在再来对比下 效果,发现无论我们控制镜头在哪个位置,小熊猫图片的下面始终对着我们。

这里已经实现了一个初级的公告板。当然也可以不用XNA的现有方法,我们可以把代码放到HLSL里面去,这里有个实现,但我帮他是数学原理没有推算过。所以只有套着用了。

float4x4 World;
float4x4 View;
float4x4 Projection;
texture Texture;sampler textureSampler=sampler_state
{texture=<Texture>;magfilter = LINEAR; minfilter = LINEAR;mipfilter=LINEAR; AddressU = CLAMP; AddressV = CLAMP;
};struct VertexShaderInput
{float3 Pos:POSITION0;float2 TexCoord:TEXCOORD0;
};struct VertexShaderOutput
{float4 Position : POSITION0;float2 TexCoord:TEXCOORD0;
};VertexShaderOutput VertexShaderFunction(VertexShaderInput input)
{VertexShaderOutput output;float4x4 worldViewMatrix = mul(World, View);   float3 positionVS = input.Pos + float3(worldViewMatrix._41, worldViewMatrix._42, worldViewMatrix._43);output.Position = mul(float4(positionVS, 1.0f), Projection);output.TexCoord=input.TexCoord;return output;
}float4 PixelShaderFunction(VertexShaderOutput input) : COLOR0
{return tex2D(textureSampler,input.TexCoord);
}technique BillBoard
{pass BillBoard{VertexShader = compile vs_1_0 VertexShaderFunction();PixelShader = compile ps_1_0 PixelShaderFunction();}
}  

这里就实现了比较常用的公告板技术。到底是用XNA现有方法,还是HLSL,自己视情况面定吧。

转载于:https://www.cnblogs.com/lm3515/archive/2010/09/18/1829995.html

XNA Billboard(公告板技术)相关推荐

  1. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计 公告板 Billboard 技术

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...

  2. 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉的诡计:公告板(Billboard)技术...

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 作者:毛星云(浅墨)   微博:@浅墨_毛星云邮箱: happylifemxy@163.com I'm back~,这段时间大家久等了~ ...

  3. opengl 纹理贴到对应的位置_一步步学OpenGL(27) -《公告牌技术与几何着色器》

    教程 27 公告牌技术与几何着色器 原文: http://ogldev.atspace.co.uk/www/tutorial27/tutorial27.html CSDN完整版专栏: https:// ...

  4. 【实时渲染】屏幕空间特效和多边形技术

    前言:主要涵盖了<real time rendring 4>第12章image space affect和第13章beyond polygons的前六节内容. 目录 屏幕空间特效(Imag ...

  5. 【转载】【《Real-Time Rendering 3rd》 提炼总结】(九) 第十章 · 游戏开发中基于图像的渲染技术总结

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/78309500 这是一篇近万字的总结式 ...

  6. Unity Shader - Billboard 广告板/广告牌 - BB树,BB投影

    文章目录 实现 CPU层 使用简单实现方式 模仿Shader层的复杂逻辑写法 向量叉乘的顺序 新的BB本地坐标系矩阵:newLocalMatrix可以不构建 2D的Billboard GPU层 带有可 ...

  7. 【《Real-Time Rendering 3rd》 提炼总结】(九) 第十章 · 游戏开发中基于图像的渲染技术总结

    本文由@浅墨_毛星云 出品,转载请注明出处.   文章链接: http://blog.csdn.net/poem_qianmo/article/details/78309500 这是一篇近万字的总结式 ...

  8. DirectX11 使用几何着色器实现公告板效果

    之前说过,可编程的着色器阶段有三个,依次是顶点着色器.几何着色器.像素着色器.之前说的都是顶点着色器和像素着色器,今天第一次详细介绍几何着色器,几何着色器是一个可选的阶段. 一.使用几何着色器的好处 ...

  9. DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果

    DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果 原文:DirectX11 With Windows SDK--17 利用几何着色器实现公告板效果 前言 上一 ...

最新文章

  1. Working with multiple environments
  2. Git 的特点—— Git 学习笔记 02
  3. 7.01面试长沙黄花机场
  4. 5、vsphere6-ESXI主机的安装及配置
  5. 机加工程序工时程序_团宠来袭 | 针对多品种小批量的机加工柔性生产解决方案...
  6. springboot-项目获取resources下文件的方法
  7. linux除法脚本,经典shell-脚本实例
  8. Spring Boot基础学习笔记22:自定义用户控制、登录与退出
  9. php怎么限制文章标题的字数,文章标题在WordPress中显示的长度即字数如何限制呢?...
  10. HFSS仿真软件完成微带天线设计
  11. Java政府类网站源码_国产java类cms
  12. NPN和PNP三极管搭建推挽电路实验
  13. 路由守卫 AJAX,vue路由传参与路由守卫
  14. 万字自动化测试面试题,助你吊打面试官
  15. 通过css设置canvas背景图片
  16. 【分享】集简云小程序识别名片到CRM流程搭建示例
  17. linux访问工具图标,linux上的编码转换工具iconv,enca,convmv
  18. 部落战争手游源码( 服务端+客户端+资源+开发文档)
  19. 阿里云配置域名解析(全过程)
  20. 迅搜 php,安装、升级 - 权威指南 - 迅搜(xunsearch) - 开源免费中文全文搜索引擎

热门文章

  1. weblogic连接池不释放问题解决_数据库连接池引起的FullGC问题,看我如何一步步排查、分析、解决...
  2. websocket 更新点位 浏览器卡顿_我们来看看Swoole是如何实现WebSocket服务器及客户端的...
  3. html不换行溢出省略号代替,css控制不溢出,不换行,溢出部分省略号显示
  4. Endnote X3 出现中文乱码
  5. 洛谷 P1207 [USACO1.2]双重回文数 Dual Palindromes
  6. 【瞎扯】About Me
  7. php的pathinfo,php中PathInfo的用法举例(图文)
  8. saiku添加mysql数据源_Saiku连接mysql数据库(二)
  9. c char转int_C指针精华知识大汇总
  10. html修改按钮背景颜色,html鼠标悬浮在按钮上,让按钮背景变色