之前介绍了vertex shader的基本原理,现在我们来做一个简单的实践,在游戏中广告版(布告版)

随处可见,而且效率很高,现在我们就使用shader来实现这一过程,首先我们要知道布告版的原理

实际上就是一直对着摄像机,与摄像机的方向上是垂直的。如下图所示:

不管摄像机如何去动,那么广告版也跟随一起动(即旋转),那么在摄像机动的时候,就要重新计算

布告版的位置,为了做到这一点,我么要对摄像机的原理有所了解,看摄像机的几个重要的参数,

观看的方向:dir

向上的方向:up

向右的方向:right

及组成如下的坐标系(就是摄像机的局部坐标系了)

黑色的表示的是世界坐标系,蓝色的是摄像机的坐标系。为了让布告版与摄像机垂直,我们要实时的对布告版的位置

做调整,首先我们要先定义下布告版的位置。然后根据计算的几个方向,就可以计算出来新的布告版的位置。

假设有四个点:如下图所示

以A点为起点,根据摄像机的 up,right,dir,就可以计算出来,B,C,D几个点的新的位置(即不管如何旋转,变化,A点的世界坐标

是不变的,我们才可以根据A计算出来B,C,D三个点的新位置)

下面就是一些数学上的基本知识了。

B点的位置如果要用摄像机垂直,及B点的方向是与摄像机的Up点是一致的。那么我们就可以计算出来它的位置。

B = A + (Width) * right;

C = A + Up* height + Width * right

D = A + Up * height

如下图:

现在我们知道了原理,就可以进行编写代码了:

uniform float size;
uniform vec3 camPos; void main()
{
vec3 vAt = camPos - gl_Vertex.xyz;
vAt = normalize( vAt );
vec3 vRight = cross( vec3( 0.0, 1.0, 0.0 ), vAt );
vec3 vUp = cross( vAt, vRight );
vRight = normalize( vRight );
vUp = normalize( vUp ); vec2 s = gl_MultiTexCoord0.zw * vec2( size/2.0, size );
vec3 vR = s.xxx * vRight;
vec3 vU = s.yyy * vUp; vec4 dir = vec4( vR + vU, 0.0 );
gl_Position = gl_ModelViewProjectionMatrix * (gl_Vertex + dir ); gl_TexCoord[] = gl_MultiTexCoord0;
}

上面的代码中有些细节给大家介绍下,为了把布告版的宽度信息与高度信息,传递给shader,我通过纹理参数来做这件事情。

我们知道纹理可以有四维(x,y,z,w),z,w就用来保存布告版的宽度与高度信息。这样就可以参与计算(而不需要在二外的

传递更多的信息).

  当然,还有很多种实现方式方法,大家可以用自己的实现方式,实现更加高效的布告版技术。如果是例子系统,其实OpenGL

也已经有一种实现方案,那就是粒子精灵,效率非常的高,大家可以参考。

  代码随后上传

OpenGL12-shader(GLSL)着色语言4-广告版的实现的更多相关文章

  1. GLSL着色语言学习。橙皮书第一个例子GLSL+OpenTK+F#的实现。

    Opengl红皮书有选择的看了一些,最后的讲着色语言GLSL的部分看的甚为不理解,然后找到Opengl橙皮书,然后就容易理解多了. 在前面,我们或多或少接触到Opengl的处理过程,只说前面一些处理, ...

  2. OpenGL12-shader(GLSL)着色语言1(代码已上传)

    OpenGL着色语言(GLSL――OpenGL Shading Language)是用来在OpenGL中着色编程的语言, 也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic P ...

  3. OpenGL12-shader(GLSL)着色语言2-(参数传递)(代码以上传)

    上一篇中介绍了如何使用shader,用来一个最简单的shader,计算顶点的位置,调用了 OpenGL 顶点着色语言中的内置变量对顶点进行操作,这一例程中,将展示如何将应用层 的数据传递到shader ...

  4. OpenGL12-shader(GLSL)着色语言3-(属性参数)(代码已上传)

    上一个例程中,使用了uniform 类型的变量,uniform可以理解为全局变量,这一节中使用 的是attribute类型的变量,翻译过来就是属性,他是与顶点绑定的,就意味着一个顶点可以 有很多个属性 ...

  5. 着色语言(Shader Language)

    摘抄"GPU Programming And Cg Language Primer 1rd Edition" 中文名"GPU编程与CG语言之阳春白雪下里巴人" ...

  6. win7,64bit下的OpenGL着色语言(glsl)开发环境配置(原)

    一.环境准备: 系统环境win7,64位,双显卡:集成显卡+gt540m,gt540建议下载最新的驱动,可以支持到opengl4.3标准,一般双显的笔记本,程序默认启用的是集显,我机器的集显驱动有点老 ...

  7. DirectX9:高级着色语言(HLSL)

    一.简介 高级着色语言(High)可以编写顶点着色器和像素着色器,取代固定功能流水线中的部分功能,在图形卡的GPU(Graphics Processing Unit,图形处理单元)中执行 注意:如果图 ...

  8. GLSL 着色器程序

    除了使用Cg/HSL 着色器程序以外, OpenGL 着色器语言(GLSL)着色器可以直接书写shader. 然而,使用原生的GLSL只推荐作为测试使用,或者你清晰的知道你的目标平台是 Mac OS ...

  9. 有关OpenGL着色语言(一)

    刚接触OpenGL着色语言...,不定期增加内容 1.OpenGL着色语言(GLSL)是什么? 用于OpenGL的面向过程的高级着色语言,是近年来图形编程领域中出现的最重要的新型开发技术,使用Open ...

随机推荐

  1. Airplace平台

    Demo: 左上角:(0, 0)开始导航,手机终端上实时在地图上当前所在显示,当前点以绿色点显示,轨迹点以红色显示. 系统架构:基于移动手机的以网络为辅助的架构.特点:低头顶交流,用户隐私和安全 &g ...

  2. Banana

    Banana 除了有香蕉的意思外,还表示 喜剧演员

  3. js常用的原生方法

    JavaScript pow() 方法 pow() 方法可返回 x 的 y 次幂的值 语法 Math.pow(x,y) 参数 描述 x 必需.底数.必须是数字. y 必需.幂数.必须是数字. 返回值 ...

  4. Android-fragment简介-fragment的简单使用

    1.fragment简介 在Android3.0版本之前Google还没有推出fragment,在Android3.0版本之后Google推出了fragment,由于Android3.0版本是过渡期版 ...

  5. 【Win10】一些零碎不好归档的小总结(原谅我这个该死的标题吧)

    一.同步方式获取设备的屏幕分辨率 public static class ScreenResolution { /// <summary> /// 获取屏幕高度. /// </sum ...

  6. DevOps Workshop 研发运维一体化(成都站) 2016.05.08

    成都的培训与广州.上海.北京一样,只是会议室比较小,比较拥挤,大家都将就了.可惜换了电脑以后,没有找到培训时的照片了,遗憾. 培训思路基没有太大变化,基本按照下面的思路进行: 第一天对软件开发的需求管 ...

  7. Layui:前后端分离之Form表单

    页面效果图: <div style="display: none;" id="formContainer"> <form class=&quo ...

  8. Content-Disposition 响应头,设置文件在浏览器打开还是下载

    Content-Disposition属性有两种类型:inline 和 attachment inline :将文件内容直接显示在页面 attachment:弹出对话框让用户下载 code: cont ...

  9. C# GDI绘制仪表盘(纯代码实现)

    纯代码实现GDI绘制仪表盘,效果在代码下面. public partial class HalfDashboardUc : UserControl { /// <summary> /// ...

  10. day 93 Restframwork

    苑昊博客: http://www.cnblogs.com/yuanchenqi/articles/7570003.html  一.queryset 特性 from django.db import m ...