在上一个文章LWRP中我们介绍了LWRP的基本使用方法,并使用ShaderGraph写了两个小例子。这次我们就来尝试一下HDRP,效果上要比LWRP或者普通渲染管线好多少。
效果预览
可以看到在HDRP中的效果还是比较不错的,各种光影的质量都还不错。
HDRP 入门
下载安装以下依赖:
创建HDRP资源并设置(这个和LWRP差不多)
设置颜色空间为Linner(这个设置很重要)
创建全局Volm管理环境
以上就是主要的步骤,下面我详细说一下一些细节的地方。
如何使用天空盒在HDRP中有多种天空类型:颜色渐变天空,纯色天空,HDRI天空,物理天空等。大家可以看到我的天空是有一些云朵的一个天空盒,在HDRP中默认是纯色的黑天空,我们可以添加一个Volume对象或者在游戏物体上挂载一个Volume脚本来对默认设置进行重写。如我这样我可视化环境组件,用于设置天空类型,这里我将其设置为HDRI,再添加一个HDRI Sky组件用于详细设置,在Hdri Sky项目中设置导入的天空盒cubemap。添加一个:在设置中设置:此时就算是把天空盒光线环境搭好了,快放入模型试试吧。
金属感和平滑度在这个模型 ...
丢失了好多文章,故更新一波,开一个新坑CG
不论是LWRP还是ShaderGraph都已经不是什么新技术了
CG杂谈计算机图形学(ComputGraph)简称CG,是一门研究计算机图形图像处理的学科,将符号或电子信号可视化是一门比较晦涩难懂的东西,比如傅里叶变换用于研究声音和波的关系,让波得以表示。众所周知,建模时我们总是使用三角面来构成一个模型,以三角面的数量来衡量一个模型的精细程度。从三维物体坐标系到二维的屏幕坐标系,深度如何表示?遮挡关系如何计算?这就是CG所研究的东西,计算机图形学也被称为程序员的浪漫,这就是这个系列要说的东西。
LWRPLWRP(轻度渲染管线)是unity推出的可自定义的渲染管线,其初衷是为了移动平台和轻度主机平台。在轻度渲染管线下,我们可以对渲染管线做更多的设置和处理,并且可以使用shaderGraph可视化的shader编辑器像连连看一样完成shader的编写。通过shader我们可以实现许多视觉效果,如飘动的红旗,水面的倒影,卡通人物渲染等;有些可以使用模型来解决但使用shader不仅高效还能处理许多模型无法解决的东西。
不知道你是否看过游戏的模型, ...
最近挺迷漫画的,但如何正确优雅的看漫画却是一大难题
PC端在Pc端看漫画还是蛮爽的,屏幕比较大,看的字迹也会清楚一些。
漫画阅读器
Covercover可以直接在win10商店下载,免费版可以同时管理25本漫画书,并且可以搭载云服务器同步您的漫画库,操作起来非常顺手,缺点是打开页数较多的漫画时,可能加载会较慢。
Eriri Eriri是蝉时雨大佬的开源项目,能够无限制的管理漫画书,操作简洁,加载漫画迅速,但在一些小方面仍需改进,如缺少漫画分类库,缺少日漫的从右至左的阅读方式等。github
移动端在移动端可以方便的随时随地看漫画,当然移动端的软件可不必PC端差哦。
tachiyomi我强烈安利tachiyomi,tachiyomi完全开源免费,由全世界的动漫爱好者一同维护和迭代,现在的版本已经非常稳定和方便了,可以通过添加插件的方式,方便的查看和下载国内外的漫画,并且可绑定云存储容器实现漫画库的实时同步,使用原生android开发,流畅度极佳!
github
ExviewExview不仅仅是一个漫画阅读器,更像是一个二次元圈子,通过各种各样的插件和扩展,不仅能使用Exview ...
有没有想过整理一下自己杂乱的学习笔记呢?有没有想自己写本书呢?
如果你有以上的想法,那么gitbook将是非常适合你的东西。
前置准备工作
安装并配置好node.js即可。
安装gitbook
$ npm install gitbook-cli -g
安装可能会比较耗时,若情况特殊请开启科学上网。在安装完成后可以查看是否安装成功:
$ gitbook -V
使用gitbook
在你想建立gitbook的文件下,输入gitbook init可以在此文件夹建立gitbook。你可以在文件中中发现这两个文件:(第一次可能有点慢)其中SUMMARY.md是本书的目录,我们可以编辑目录后再次使用gitbook init来更新书本。
# Summary
* [Introduction](README.md)
* [笔记](note1/笔记.md)
我们可以在SUMMARY下追加一个目录如上,其中在目录中显示的名字,gitbook会自动生成目录和文件。然后我们更新书本。
启动本地预览
gitbook serve
完成后我们就可以在4000端口访问了。
使用vs ...
Unity版本号:2019.3.0f6
TimeLine 是unity2017推出的新功能,其采用时间线的形式组合场景资源, 可以用于编排游戏剧情,过场动画,斩杀镜头,人物特写等效果。
创建TimeLine
用于播放TimeLine的物体必须有这个组件:
参数名
作用
Playable
Playable资源(TimeLine资源)
Update Method
更新模式
Play On Awake
是否启动时自动播放
Wrap Mode
结束模式,None播放完回到原先属性,Loop循环播放,Hood播放完维持改变
Initial Time
延迟时间
轨道面板
点击左侧的+,可以添加轨道,这是一个类似视频剪辑的界面,我们可以方便的对轨道进行移动和剪辑。
Activation
Activation用于表示物体的激活状态:
Animation
Animation用于播放动画,既可以播放已有的动画,也可以自己录制帧动画来使用。注意:使用此轨道的物体会被创建一个Animator Controller ...
lua虽然没有面向对象的概念,但我们实现面向对象并不困难
一下内容我参考了多处lua教程,很多教程讲解模糊晦涩,我整理了以下以简明的说明方式完成lua面向对象这部分的内容,希望大家喜欢。
面向对象OOP
学习过Java,C#,Ruby等的同学可能不会对面向对象陌生,如果你是第一次接触面向对象?那么我总结一下就是:将事物抽象成类,将特征抽象为字段和属性。在Lua中,最强大的就是table这种数据结构了,来看下面这个例子:
Cat={name="defalut",color="白色"}
function Cat.say()
print(Cat.name..' '..Cat.color..':','喵喵喵~')
end
Cat.name='小白'
Cat.say()
运行结果为:小白 白色: 喵喵喵~
在例子中,我们创建了一张表,并在表中提供2个字段和一个函数,并通过表名.字段名调用字段和方法,这像不像 一个静态类呢?以下是Csharp的一个类似的静态类:
class Program
{
static void Main(s ...
平时我们在其他语言中,经常会用到如数组,矩阵,队列和栈等一些数据结构,而lua似乎并没有这些数据类型,lua只提供了table类型,但是通过table类型我们几乎可以实现所有常用的数据类型。
数组
数组的实现非常简单,table的数据类型类似与C#中的字典,存储kv对,我们只取value即可。
1234local arr={1,2,3,6,4}for key, value in pairs(arr) do print(key,value)end
矩阵
矩阵也被称为多维数组,我们只需要嵌套一个table即可。
1234567local mt={}for i = 1, 10 do mt[i]={} for j = 1, 10 do mt[i][j]=0 endend
链表
对于像链表这样的数据结构,我们可以方便的通过一个指针域实现。
-- 链表
local l=nil
local l2={next=nil,value=10}
l={next=l2,value=200}
while ...
使用协同程序可以更加高效的处理数据或执行任务
协同的基础
创建协同程序
local co=coroutine.create(function ()
print('Hi')
end)
协程的状态
协同有三个状态:挂起态、运行态、停止态。当我们创建一个协同程序时他开始的状态为挂起态,也就是说我们创建协同程序的时候不会自动运行,可以使用 status 函数检查协同的状态:
print(coroutine.status(co))
启动协程
使用coroutine.resume()可以启动协程例如:coroutine.resume(co)启动协程后,会立即执行协程方法中的内容。
挂起协程
如有需要coroutine.yield()可以挂起协程。让我们来看下面这个例子,创建一个协程,在协程函数中构建一个循环,并在打印后挂起当前协程,我们不断的去调用协程。
local th=coroutine.create(function ()
for i = 1, 3 do
print("th=",i)
coroutine.yi ...
lua的特点之一就是方便的调用chunk(代码块)
通过这种特性,我们可以在a.lua中调用b.lua的内容,甚至可以从字符串文本中调用lua当做函数执行~
load
让我们先来看一下load函数的定义:!{load函数}(https://i.loli.net/2020/02/04/DYGV2CSWoPcL49v.png)通过定义我们可以知道load函数可以加载文本和二进制类型代码块,来让我们尝试一下:
local f=load('I=I+1')
I=0
f()
print('I='..I)
f()
print('I2='..I)
在这个例子中,我们使用load加载了'I=I+1'这一串字符串,并把加载结果存储在f中。通过使用f()来调用函数。
loadFile
和load类似的还有loadfile,但loadfile加载的是文件而非字符串。
我们在funTest.lua文件中写一句输出:print('Test')然后在其他文件中调用:
local fun=loadfile('funTest.lua',"t")
fun()
通过这种 ...
在前面我们学习函数时,我们说过函数其实是值,我们可以将函数放在表中。那么我们是不是可以这么做:
12345678local fasty={a=1}function fasty.Say(arg) print('Say:'..arg)endfunction fasty:Say2(arg) print("Say:"..arg)end
在这里,我们创建了一个表fasty,表中默认有a一个元素。然后我们给表创建了两个函数say和say2,这2个函数的作用都是将给与的参数输出。
调用不同
在我们调用这2个方法时,我们应该明确:
使用.声明的方法使用.调用,使用:声明的方法使用:调用
假如我们要使用.调用:声明的方法,那我们需要传递一个this指针给函数
也就是说: 其实是自动传递一个this指针给函数。
123456789101112131415fasty.Say(100)fasty:Say2(200)fasty.Say2(fasty,200)```lua<strong>Ps</strong> ...











