Rocky Lai 的技术博客

学习、思考、分享


  • 首页

  • 归档

  • 分类

  • 标签

  • 关于

瞎聊 Unity Shader 系列之八:#pragma 指令

发表于 2015-05-07   |   分类于 Shader

第三节 [Shader 土地上的语言们] 里面说到过 CG 和 HLSL 等语言被 GGPROGRAM ... ENDCG 语句块里面。这节的主角 #pragma 出现的位置就是在这个语句块里面,用来做编译指示的。就好比告诉 Shaderlab 的编译器,你应该这么干应该那么干。这里把 #pragma 叫做编译指令吧。

CGPROGRAM ... ENDCG 语句块根据 Shaderlab 写作方式不同,它的位置也不同。

  • 如果是 surface shader, 它在 Subshader 语句块里面,不是在 Pass 语句块里面
  • 如果是 vertex&&framgment shader,它是 Pass 语句块里面

其实 surface shader 最终会编译成 vertex&&framgment shader, 最终结果是一样的的。surface shader 会被编译成含多个 Pass 的 vertex&&fragment shader, 而这些都用相同的编译指令。我们可以从 Inspector 的 shader 属性信息里面去打开被编译为 vertex&&fragment shader 后的代码。

surface shader

如果本身不是 surface shader 的话,上面那个 show generated code 按钮是不会出现的。上面提到 #pragma 是在 CGPROGRAM ... ENDCG 语句块里面的,所以它出现的位置也符合上面提到的特征。

阅读全文 »

瞎聊 Unity Shader 系列之七:究竟谁先被渲染?

发表于 2015-05-06   |   分类于 Shader

这节的问题: 假设有很多对象需要渲染,而你想自己指定这些对象被渲染的顺序的话应该怎么做?

先上答案:使用 Subshader 的 Queue 标签指定。

那 Queue 标签又是是那么?? 我们继续往下看,先介绍 Subshader 的标签

Subshader 的标签

在上一节 [初识 Shaderlab] 中我们知道 Subshader 语句块内有个 [Tags] 可选项,它的作用是是配置渲染引擎应该 什么时候 和 怎么样 去渲染。这就是 Subshader 的标签。

它的语法是:

Tags { “TagName1” = “Value1” “TagName2” = “Value2” … }

就是 Tags 语法块内带有若干键值对项(理论上可有很多很多个这种键值对)。可以填写的些键值对可以参考 这个页面

需要注意一点 它只能写在 Subshader 语句块里面,不能写在 Pass 语句块里面。

阅读全文 »

瞎聊 Unity Shader 系列之六:初识 Shaderlab

发表于 2015-05-05   |   分类于 Shader

好吧,其实这不算初识 Shaderlab 了,因为在 [shaderlab 土地上的语言们] 这节中已经说到在 shaderlab 中有三种方式来写 shader。这节的内容主要是来认识下 shaderlab 语法写出来的 shader 长得什么样子。

下面有段基于 shaderlab 的 shader 的大概框架的伪代码,在之前要解释下代码中带中括号的部分,如 [Properties], 表示是可以选择的,也就是说可以不写。

阅读全文 »

瞎聊 Unity Shader 系列之五:RGBA 101

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

这节说说 fragment shader 最后输出的像素的颜色表示方法 RGBA。

玩过 Photoshop 的同学可能知道,存在好几种颜色模式来表示颜色,比如 RGB 和 CMYK. 由于显示器的发光物体,所以使用的 RGB 模式。Unity 中也采用这种表示方法。

RGB模式

RGB是用红绿蓝混合来表示的颜色。R 是红色, G 表示绿色, B 是蓝色。一般用8为来表示一个颜色通道,每个通道有 256 个等级(0~255)。它有如下特性:

  • (0, 0, 0) 表示黑色
  • (255, 255, 255) 表示白色
  • 三个通道数值相同的时候是灰色,比如 (128, 128, 128)
  • 数值越大颜色越亮,反之数值越小越暗

RGB

但是 Unity Shader 中并不用 256 个等级来表示颜色数值,而是用标准化(取值0~1)的数值来表示。换句话说就是所有通道都除以 255 得到标准化的结果。

RGBA 中的 A 是什么

阅读全文 »

瞎聊 Unity Shader 系列之四:坐标系

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

这节从很平常一段对话开始:

甲跟乙说: 喂,你看到那个人没有?
乙: 你说的是哪个?
甲: 就是那棵树旁边那个。

从对话里面我们知道:要描述一个物体的位置,我们需要借助参照物。 其实甲也可以这么说:

甲: 在那个个子很高的人左手边那位。

所以说 参照物是可以选择的,可变的。

我们把上面对话推广到坐标系上,来给坐标系下个山寨的定义:坐标系是为了描述物体位置而存在,我们借助的参照物是它的原点。由于可以选择不同的参照物,所以我们可以选择不同的原点。 原点很重要,我们利用坐标系的时候首先要知道原点在哪里。

既然原点可以任意选,那不是说会出现很多坐标系? 是的,但是我们使用几种约定的坐标系就好了。

阅读全文 »

瞎聊 Unity Shader 系列之三:Shader 土地上的语言们

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

这节是关于 Unity 平台上 shader 语言的选择。

计算机行业的各公司(或者组织)似乎都遵循着某种规则。当他们在某个领域划出了一亩三分地,当上了地主后, 就要用方法圈住干活的农民。让他们觉得在我这里不会饿死,有饭吃,你要到别家干活的话,需要重头再来,这是一个很亏本的买卖。这个方法就是制定自己体系(软硬件中的各种协议,接口,语言,框架),脱离这套体系,在别的地方玩不起来。开个玩笑来取名这个规矩叫做圈地规则吧。

Shader 语言们

根据上面提到的圈地规则,下面来隆重的介绍下 shader 这块地上地主们建立起来的体系:CG, HLSL 和 GLSL 语言

  • CG: C for Graphics 的简称,是 NVIDIA 公司开发的语言。从名字上来看的出它是 C 语言的亲戚,现实是它保留了 C 语言的大部分语义。
  • HLSL: High Level Shader Language 的简称,由微软开发的语言。语法跟 CG 非常的相似。
  • GLSL: OpenGL Shading Language 的简称,OPENGL 组件开发的,语法也是基于 C 语言的。

那么问题来了,Shader 语言到底哪家强?这个也发生过强烈的讨论。

阅读全文 »
1…5678
Rocky Lai

Rocky Lai

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