之前介绍了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. 如何更新world文档的目录

    在想要设置目录的文档页,右键 -> 更新域, 或者在想要设置目录的文档页,按下 F9 即可 拓展: 在目录文档页  ,按Ctrl 并且单击鼠标可以跟踪目标连接 如果内容对您有所帮助,请打赏--- ...

  2. hdu 2049 不容易系列之考新郎 && 对错排的详解

    题目 错排:  当n个编号元素放在n个编号位置,错排的方法数记着D(n) ⒈把第n个元素放在一个位置,比如位置k,一共有(n-1)种方法: ⒉放编号为k的元素,这时有两种情况: 1°把它放到位置n,那 ...

  3. LINUX中关于SIGNAL的定义

    /* Signals. */ #define SIGHUP 1 /* Hangup (POSIX). */ #define SIGINT 2 /* Interrupt (ANSI). */ #defi ...

  4. swipe js bug

    最近因为要写新的mobile site页面,有好几个页面上面必须用到photo slider. 使用插件: /* * Swipe 2.0 * * Brad Birdsall * Copyright 2 ...

  5. Using Integrated SOA Gateway in Oracle EBS(websevice)

    http://blog.csdn.net/pan_tian/article/details/10159935 Oracle EBS如何与第三方系统相集成?比如这样的需求,X系统知道物料编码,需要从EB ...

  6. centos php Zookeeper kafka扩展安装

    如题,系统架构升级引入消息机制,php 安装还是挺麻烦的,网上各种文章有的东拼西凑这里记录下来做个备忘,有需要的同学可以自行参考安装亲测可行 1 zookeeper扩展安装 1.安装zookeeper ...

  7. ADO.NET系列之Connection对象

    ADO.NET系列之Connection对象 ADO.NET系列之Command对象 ADO.NET系列之DataAdapter对象 ADO.NET系列之事务和调用存储过程 ADO.NET概念 ADO ...

  8. sqlserver错误2,error 40

    打开配置管理器:开始-> sqlserver2014->配置工具->配置管理器 选择sqlserver服务,并将右侧箭头的指向右击设为启动就OK了

  9. .net core AOP之Filter

    当我们进行项目开发时,往往在开发过程中需要临时加入一些常用功能性代码,如身份验证.日志记录.异常获取等功能.如果每个方法中都加入这些功能性代码的话,无疑使项目显得过于臃肿,代码繁杂.这时候就要加入过滤 ...

  10. win10开机 依赖服务或组无法启动

    win10开机后 音频服务 网络服务等都没有开启,下面是开启步骤 Win+R打开的[运行]窗口输入“msconfig”后回车或者点击[确定] 在打开的[系统配置]窗口选择[服务]选项卡 在[服务]选项 ...