Libgdx 高级渲染之 高斯模糊

本文介绍了如何在Libgdx中实现高斯模糊效果。首先解释了高斯模糊的基本概念,然后详细阐述了在Libgdx中通过GLSL着色器创建自定义渲染过程,包括顶点着色器和片段着色器的编写,以及如何使用SpriteBatch进行渲染。文章还提供了完整的代码示例。
摘要由CSDN通过智能技术生成

Libgdx 高级渲染之 高斯模糊

 

一、 什么是高斯模糊

               首先,当然是先了解什么是高斯模糊。高斯模糊,在Photoshop中是一种滤镜特效,网上有详细的讲解, 笔者就不浪费口舌。

   具体原理,请看 云彩挂上的二叉树 高斯模糊算法的实现和优化,有关于高斯模糊高阶知识。在游戏开发中,可以作为一种很有趣的特效,比如游戏暂停时,将主游戏界面进行模糊,同时,有不至于太过于静态,比如,将特定的界面进行模糊,得到较好的用户体验。

 

  二、 在Libgdx中的实现

          那么,在Libgdx中是怎么实现? 先上效果图对比一下。

未进行模糊处理

                                                                           未进行高斯模糊

模糊处理

                                                                 进行高斯模糊处理

    本基于libgdx1.5.4开发。

      因为没装好Eclipse Gradle 插件,为了方便,楼主只创建的Desktop工程:

          实际上笔者只是创建一个Demo,在stage绘制一张图片,当然,你也可以单独对一张图片进行渲染。对单个Stage整体进行渲染,并非完整游戏。在此,只需要了解BlurUils.java这个类。该类是笔者将高斯模糊封装为一个工具类。

1.创建GLSL着色器

         为什么使用GLSL?GLSL是OpenGL着色语言,笔者对GLSL语言不甚了解,其语法类似C语言。下面这两个着色器是笔者在官网wiki

https://github.com/mattdesl/lwjgl-basics/wiki/Shaders上找来再修改的。里面有对高斯模糊的详细描述,不过是英文版的。

首先是顶点着色器 vertex.vert

//combined projection and view matrix
 uniform mat4 u_projTrans;
//"in" attributes from our SpriteBatch
 attribute vec2 a_position; attribute vec2 a_texCoord0;
attribute vec4 a_color;
//"out" varyings to our fragment shader
varying vec4 vColor;
varying vec2 vTexCoord;
void main() {
vColor = a_color; vTexCoord= a_texCoord0; gl_Position = u_projTrans * vec4(a_position,0.0, 1.0); }


 

u_projTrans  投影和视图矩阵联合,stage的矩阵

a_position 顶点数据

a_texCoord0 传入的纹理

这个着色器实际上是对纹理数据进行初始化

 

片段着色器 fragment.frag

//"in" attributes from our vertex shader
varying vec4 vColor;
varying vec2 vTexCoord;

//declare uniforms
uniform sampler2D u_texture;
uniform float resolution;
uniform float radius;
uniform vec2 dir;

void main() {
    //this will be our RGBA sum
    vec4 sum = vec4(0.0);
    
    //our original texcoord for this fragment
    vec2 tc = vTexCoord;
    
    //the amount to blur, i.e. how far off center to sample from 
    //1.0 -> blur by one pixel
    //2.0 -> blur by two pixels, etc.
    float blur = radius/resolution; 
    
    //the direction of our blur
    //(1.0, 0.0) -> x-axis blur
    //(0.0, 1.0) -> y-axis blur
    float hstep = dir.x;
    float vstep = dir.y;
    
    
    //apply blurring, using a 9-tap filter with predefined gaussian weights
    
    sum += texture2D(u_texture, vec2(tc.x - 4.0*blur*hstep, tc.y - 4.0*blur*vstep)) * 0.0162162162;
    sum += texture2D(u_texture, vec2(tc.x - 3.0*blur*hstep, tc.y - 3.0*blur*vstep)) * 0.0540540541;
    sum += texture2D(u_texture, vec2(tc.x - 2.0*blur*hstep, tc.y - 2.0*blur*vstep)) * 0.1216216216;
    sum += texture2D(u_texture, vec2(tc.x - 1.0*blur*hstep, tc.y - 1.0*blur*vstep)) * 0.1945945946;
    
    sum += texture2D(u_texture, vec2(tc.x, tc.y)) * 0.2270270270;
    
    sum += texture2D(u_texture, vec2(tc.x + 1.0*blur*hstep, tc.y + 1.0*blur*vstep)) * 0.1945945946;
    sum += texture2D(u_texture, vec2(tc.x + 2.0*blur*hstep, tc.y + 2.0*blur*vste
1 课程简介:本课程详细讲解了OpenGL从入门到精通的理论+实践知识,对于每一个知识点都会带领学员通过代码来实现功能。其中涵盖了基础图元绘制,基础光照,高级过程,高级光照等内容;当前图形引擎的应用已经越来越广泛,春晚以及各大综艺节目已经开始使用XR作为主流的内容制作技术,房地产漫游及Web渲染技术已经开始茁壮发展,VR也即将突破硬件瓶颈;普遍的游戏引擎在独特的领域已经无法完全实用,且我们国家要发展自主科技技术,图形引擎以及CAD等卡脖子技术一定会蓬勃发展,所以同学们要抓住机会,趁势而上,熟悉底层,博取更大发展,学习OpenGL底层接口的应用以及图形学算法,将是您向纵深发展的第一步!2 课程解决优势:很多同学学习OpenGL最难的是找到路径,并且其中牵扯到的理论知识点无法完全理解透彻(比如VAO与VBO的区别,MVP矩阵变换的推导及原理,光照系统的设计及算法推导,帧缓存的灵活应用等),我们的课程可以带领大家从原理+实践的角度进行学习,每一个知识点都会:a 推导基础公式及原理 b 一行一行进行代码实践从而能够保证每位同学都学有所得,能够看得懂,学得会,用得上,并且能够培养自主研究的能力。学习课程所得:学习本课程完毕之后,学员可以全方位的完全了解OpenGL当中的必要接口,并且可以对图形学的基础知识融会贯通,可以制作中级的特效。并且对于UnrealEngine以及Unity3D的学习更加轻松,对于各类商业引擎当中的算法以及内容制作手法更加深刻理解把控。学员也可以自行进行图形引擎的设计以及研究,并且将本课程的知识点进行代码模块化编写;能够自主推导图形学管线以及应用当中的各类公式,并且理解其几何含义。 代码与PPT资源,已随课程附赠,请同学们对应课程下载 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值