- 博客(12)
- 资源 (6)
- 收藏
- 关注
原创 冰火围城过场动画
概述冰火围城里的过场动画,犹如一团火焰,把地图烧毁,气势磅礴。效果如下图: 原理首先我们需要给当前游戏画面截个屏,作为背景图。通过gradientmain(以下简称gmain)这张图控制燃烧进程。白色部分就是未燃烧到的截屏图,黑色部分是已经烧掉的部分,中间的渐变就是正在燃烧的部分。 仔细的同学已经注意到了,gradientfire(以下简称gfire)这张图和gmain有点相似。gfire的
2015-12-30 17:37:33 744
原创 【Unity Shader】剖析Unity Surface Shader背后机制(二)
上一篇结尾,给出了一个最简单的Diffuse的surface shader翻译成vertex/fragment shader之后的代码。乍看上去可能一头雾水,下面将会一一分解。 整体来看,相较于surface shader,unity自动生成了两个pass(ForwardBase,ForwardAdd),这两个pass的作用,在上一篇中也已经说明。接下去,对照着代码,我们来分解下unity具体做了些什么。
2015-12-24 16:36:28 4112 2
原创 【Unity特效】永恒战士3中的死亡特效
概述玩过永恒战士3的玩家,应该对它的怪物死亡特效记忆犹新,没玩过也不要紧,先放一张效果图。 原理首先,我们需要2张控制图,如下所示。 模型由它原本的贴图,逐渐过渡到storm贴图的,看上去类似尘埃的效果。timeline则用于显示效果的控制,随着uv的x方向的逐渐递增,会看到光环闪过,并且x坐标接近1时,alpha会快速递减。 我们看到,模型有一个顶点外扩的过程。这里加了一个控制,
2015-11-13 15:31:00 1300
原创 【Unity Shader】剖析Unity Surface Shader背后机制(一)
概要Unity自3.x起,推出了surface shader功能,极大地简化了shader的编写,尤其是光照处理这块。surface shader说白了就是一套代码生成器,最终还是转换为vertex/fragment shader,优点在于隐藏了许多很少会被改动,然而工作量却巨大的细节,例如处理不同光照类型,lightmap,阴影等。开放给开发者的是最多被修改的一些参数,例如颜色,法线等。当然还提供
2015-09-09 11:46:34 2256
原创 投影矩阵推导
概要投影变换是计算机图形学的基础,理解并推导投影矩阵也是很有必要的。正交投影比较简单,没有透视失真效果(近大远小)。而透视投影比较符合人类的眼睛感知,平行线在远处会相交于一点。 投影是通过一个4x4的矩阵来完成的,将视锥映射成标准观察体(齐次裁剪空间)。正交投影OpenGLOpenGL采用的是右手坐标系,z轴朝屏幕向外,因此观察方向是朝着z轴负方向的,那么将x,y,z坐标从区间[l, r],
2015-08-04 18:41:39 3681
原创 图形渲染管线
概述图形渲染管线(Graphics Pipeline),简单的说就是把摄像机看到的东西,绘制成一幅2D图像的过程。可以分为3个阶段: 1. 应用程序阶段 2. 几何阶段 3. 光栅化阶段 [图1-1 可编程渲染管线]应用程序阶段这个阶段是在CPU上执行的,例如batching,遮挡剔除(occlusion culling)等加速算法。因为视锥裁剪(frustum culling)是在v
2015-07-09 12:07:49 1231
原创 Lua程序设计(第2版)第六章学习随笔——深入函数
1. 函数作为“第一类值”,可以存储在变量或table中,可以作为函数实参,或者函数返回值。2. 函数是匿名的,诸如print的函数名,只是持有该函数的变量。 a = {p = print} a.p("Hello World!") --> Hello World! print = math.sin a.p(print(1))
2009-03-16 09:38:00 382
原创 Lua程序设计(第2版)第五章学习随笔——函数
1. 函数名后面必须加(),只有当函数只有一个参数,并且此参数是一个字面字符串或table构造式时,()可有可无。dofile a.lua dofile(a.lua)f{x = 10, y = 20} f({x = 10, y = 20})type{} type({}) 2. 多重返回值 1. 将函数调用作为一条单独的语句,
2009-03-13 16:49:00 410
原创 Lua程序设计(第2版)第四章学习随笔——语句
1. 多重赋值来交换两个变量a[i], a[j] = a[j], a[i] -- 交换a[i]与a[j] 2. local foo = foo 创建一个局部变量foo,用全局变量foo初始化它。这样可以加速当前作用域中对foo的访问。而且如果后续函数改变全局foo的值,那么可以在这里先将它的值保存起来。 3. repeat-until 1. 测试在循环体之后做
2009-03-13 15:54:00 433
原创 Lua程序设计(第2版)第三章学习随笔——表达式
1. a = {}; a.x = 1; a.y = 0b = {}; b.x = 1; b.y = 0c = a结果: a == c; a ~= b。对于table, userdata和函数,Lua作引用比较(当引用同一个对象时才相等)。 2. and : 如果第一个操作数为真, 就返回第二个操作数;反之返回第一个操作数。or : 如果第一个操作数为为真,就返回第一
2009-03-13 13:56:00 335
原创 Lua程序设计(第2版)第二章学习随笔——类型和值
1. print(type(type(X))) --> string type()函数返回值一个string 2. Lua中的布尔值false和nil为假,其他情况为真(包括0和空字符串) 3. page = [[ ]] 一对匹配的双方括号来界定一个字母字符串。 4. [
2009-03-13 11:15:00 373
原创 Lua程序设计(第2版)第一章学习随笔——开始
1. 块注释:--[[ code --]] 2. print(b) --> nil 对于未初始化的变量,其值为nil 第一章是整本书的开头,也是LUA的开始,讲的内容都很简单,列出以上两个小细节备忘。
2009-03-13 10:16:00 333
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人