Rocky Lai 的技术博客

学习、思考、分享


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

瞎聊 Unity Shader 系列之二:渲染管线

发表于 2015-04-28   |   分类于 Shader

这节描述的是图形渲染的大致过程。

为了更好理解和记忆这节内容,先来学下面几个词。

  • 渲染管线(Rendering Pipeline): 一提到管线,感觉很高大上的样子。说的俗一点就是可以理解为流水线。渲染管线我们可暂时理解为 从得到模型数据到绘制出图像 这一过程的称呼。
  • Vertex Shader: 对顶点数据编程的一段程序。 人类有懒惰的天性,习惯用简化的词汇来表达同一个东西。对 Vertex Shader 也不例外,一般称其为 VS ,但是在本系列文章中会保持全称。
  • Fragment Shader: 对像素数据编程的一段程序。这里 fragment 可以理解为带有信息(颜色,坐标等)的像素 (Pixel), 一般也简称其为 FS 或者 PS 。 在本系列文章中会保持其全称。
  • FrameBuffer: 缓存帧数据的存储区,它一般包含的是要显示到显示设备上的位图数据(也就是图片数据)。
  • Fixed Function: 由于一些硬件支持等历史原因,早期的图形 API 只支持对 GPU 做配置,这部分只可配置的功能就是 fixed fucntion。这里注意下,fixed function 的功能只能配置,不像 Vertex Shader 和 fragment Shader 可以编程(写自己的算法)。

渲染管线 (Rendering Pipeline)

看图说话

2.renderingpipeline.jpg

上面是可编程的渲染管线模型的示意。下面多说几点:

  • 输入阶段。Unity 使用 Mesh Renderer 等组件读取模型顶点数据,然后调用图形 API,将数据传递给 GPU。
  • 现实中同时会进行多条渲染管线,他们是并行的。 这点概念比较重要,以后还会提到它。我们记住 GPU 并行能力很强。
  • 最后输出的 FrameBuffer (可以理解为渲染出来的图片) 有几率被抛弃掉,也就是说不显示在显示设备上。这个以后单独说明原因。好比残酷的现实世界,努力了(整个渲染过程)也不一定会成功(被显示出来)。
阅读全文 »

瞎聊 Unity Shader 系列之一:GPU 与 Shader Model

发表于 2015-04-26   |   分类于 Shader

我想首先唠叨下我为什么打算写这一系列的文章及文章的定位。

我写的动力主要来源于如下原因:

  • 对之前学习的一些总结、复习和提炼
  • 尽可能的填充一些概念上的空白。 有不少关于 Unity shader 的文章只讲 Shaderlab 语法,讲各种光照模型等, 这对于缺乏概念的新手来说是不太好理解的。
  • 之前信誓旦旦的跟朋友说以后学了 shader 会写点文章出来,算是允诺。。。

文章定位:

  • 这是学习笔记,不是教程。如果内容会有出入,非常感谢和希望您能指正。
  • 主要基础概念为主,可能很零散。

之前有前辈说过,学习一门知识前,了解其由来对入门很有好处。我比较赞同这个观点,所以开篇我们来说写历史。

CPU 之外的另外一个 PU - GPU

随着计算机处理图形的计算量越来越来大,CPU难以满足计算速度上的需求, 为了将图形的计算单独拿出来执行,上世纪70年代开始出现了为加速图形绘制的硬件。这些硬件跟大部分刚出来的新事物一样,功能有限,而且不太完善,当然那个时候也不叫 GPU。

1999 年,NVIDIA 公司发布了 GeForce256, 并且提出一个 Graphics Process Unit (GPU) 概念。很多文章都提到这款显卡有划时代的意义,因为它是第一款带有可编程顶点处理能力的显卡,这意味着显卡从之前的只可配置上升到了可编程的高度,开发者从此可以实现自己顶点处理算法。NVIDIA 也是提出 GPU 这个词来对 GeForece256 与之前显卡做区分。

2000 年以后, GPU 技术一直在不断的发展,处理和运算能力不断打变强变大。为了利用 GPU 强大的并行计算能力,出现了 CUDA 并行计算平台。有兴趣的同学可以关注下CUDA官网.

阅读全文 »

在 Unity uGUI 中绘制圆形图片

发表于 2015-04-15   |   分类于 Unity

最近项目需要在 Unity 的新 UI 系统中实现圆形头像的功能,之前想通过 Mask 控件的方式来实现,但是一番努力后毫无头绪,只能祭上shader了。

大体的思路就是在一个空的 Object 上面挂上 RawImage 组件,组件的 Material 挂上本文中的 shader。截取的逻辑是选取图片正中心 (0.5, 0.5) 为圆的中心点,绘制图片在圆内的像素点为图片的像素,然后图片在圆外的像素点设置为 alpha 为 0 的点,
如 (0, 0, 0, 0)。逻辑是在 fragment shader 里面实现(shader 代码中的frag)。

下面直接放出 shader:

阅读全文 »

一个例子学习Swift中的闭包用法

发表于 2015-03-26   |   分类于 一点一滴

初学习Swift, 觉得Swift中的闭包用法比较灵活, 所以在学习的时候编了个小例子来把用法罗列了出来, 分享出来给大家。

在讲例子之前我们来看下什么是闭包(Closure).《The Swift Programming Language》是这样定义的:

Closures are self-contained blocks of functionality that can be passed around and used in your code

中文版中这样翻译:

闭包是自包含的函数代码块,可以在代码中被传递和使用。

看解释我们知道,闭包是代码段,它能实现一些逻辑(函数),它可以被传递和使用(就像类型一样)。

然后我们来看看闭包长的什么样子。下面是闭包的定义:

{ (parameters) -> returnType in
statements
}

上面定义中 parameters 是指参数, returnType 是返回类型,而 statements 指的是我们要实现的逻辑的代码, 闭包的代码都被 {} 包含着。
观察力强的同学们估计发现了,它怎么跟Swift的函数长的差不多,难道它们是亲戚? Swift中函数是一种特殊的闭包,记住函数是闭包,不是闭包是函数哦。

接下来我们说说文章开头提到的那个栗子。

阅读全文 »

如何在Github for Mac/Windows上使用非Github的仓库

发表于 2015-01-28   |   分类于 一点一滴

[2015-08-14 更新] 之前的 Github for Windows 和 Github for Mac 已经合并成 Github Desktop 了。下载地址为 https://desktop.github.com

你或许跟我一样,不想花太多时间去”精通”git的各种命令,想用简单明了的方法来玩git。而Github的客户端恰是这种良药。使用过的童鞋可能有过跟我一样困惑:Github客户端在界面上只能管理Github的代码仓库,怎么才能管理非Github的仓库呢?

这个问题也就是本文要解决的内容。先讲Github for Mac, 然后是Github for Windows

阅读全文 »

从C#到Python

发表于 2015-01-07   |   分类于 一点一滴

项目组最近可能要用Python写一插件,虽然自己只是会用,但是还是被要求给大家做个简单的Python入门培训。只能冲个胖子,硬着头皮上了。
由于项目组里大部分童鞋们都会C#,可能如果从C#做类比的角度来阐述Python语法会更好点,然后下面奇怪的Python教程出来了。大家可以在这里得到PPT和代码: https://github.com/wudixiaop/Nana/tree/master/Python/Tutorial/Python%20Quick%20Start。

下面是讲语法的代码,语法部分在注释中有描述。

阅读全文 »
1…678
Rocky Lai

Rocky Lai

48 日志
4 分类
14 标签
GitHub 邮件
© 2014 - 2017 Rocky Lai
由 Hexo 强力驱动
主题 - NexT.Mist