博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Unity着色器和屏幕特效开发秘笈(原书第2版)》一2.2 漫反射着色
阅读量:7044 次
发布时间:2019-06-28

本文共 1639 字,大约阅读时间需要 5 分钟。

本节书摘来自华章出版社《Unity着色器和屏幕特效开发秘笈(原书第2版)》一书中的第2章,第2.2节,作者 [英]艾伦朱科尼(Alan Zucconi) [美]肯尼斯拉默斯(Kenneth Lammers),更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.2 漫反射着色

在开始学习纹理映射之前,我们需要先理解漫反射着色是怎么工作的。某些物体的颜色比较均匀,表面很光滑,但是又不是光滑到那种像镜子一样光亮的程度。这种非反光材料最好的渲染方式就是使用漫反射着色器。虽然在真实世界中纯漫反射材料本身并不存在,但在游戏世界中漫反射着色器是一种大量用到的相对廉价的着色方式。

2.2.1 准备工作

创建漫反射着色器有多种方式。最快的一种方式是从Unity 5 的标准着色器开始,然后编辑标准着色器,移除所有纹理。在第1章中我们就是这么做的。

2.2.2 操作步骤

我们从标准着色器开始,按照下面的步骤逐步进行:

  1. 删除除_Color之外的所有属性:

c7633af14f52d28e64481ddb5064110adeeeea93
  1. 在SubShader{}部分,删除_MainTex、_Glossiness和_Metallic变量。注意不要删除uv_MainTex,因为Cg不接受空的输入。这个值会被忽略。
  2. 删除surf()函数的函数体,用下面的代码替换:

cb261f3312490c225c24925f9c68551e5dfc02c4
  1. 你的着色器应该看起来是这样的:

    de5c195e8e85c5f83007addec326c5fa6eaa060c

    因为该着色器是在一个标准着色器的基础上修改的,它会使用基于物理基础的渲染方式来模拟光照行为。如果你想做一种非拟实的外观,可以直接修改第一个#pragma指令来让其使用Lambert而不是Standard。如果你这么做了,还应该将SurfaceOutputStandard替换为SurfaceOutput。

    2.2.3 工作原理

    着色器中,材质的渲染属性和光照模型之间是通过表面输出来通信的。表面输出是对当前光照模型所需的所有参数的一个封装。所以你应该能理解不同的光照模型需要不同的表面输出结构了。下面列出了Unity 5中三种主要的表面输出结构。

    着色器类型 Unity 4 Unity 5
    漫反射着色器 任意表面着色器
    SurfaceOutput 标准着色器
    SurfaceOutputStandard
    高光着色器 任意表面着色器
    SurfaceOutput 标准着色器(高光设置)
    SurfaceOutputStandardSpecular

    SurfaceOutput结构有如下属性:

    fixed3 Albedo:表示材质的漫反射颜色。
    fixed3 Normal:如果写的话表示切面法线。
    fixed3 Emission:表示材质发射的颜色(该属性在标准着色器中声明为half3)。
    fixed Alpha:表示材质的透明度。
    half Specular:表示光亮度,值从0到1。
    fixed Gloss:表示光强度。
    SurfaceOutputStandard结构有如下属性:
    fixed Albedo:表示材质的基础颜色(表示是漫反射还是高光)。
    fixed3 Normal。
    half3 Emission:该属性声明为half3,而在SurfaceOutput中名字是fixed3。
    fixed Alpha。
    half Occlusion:表示遮挡,默认是1。
    half Smoothness:表示光滑度,0表示粗糙,1表示光滑。
    half Metallic:0表示非金属,1表示金属。
    SurfaceOutputStandardSpecular结构有如下属性:
    fixed3 Albedo。
    fixed3 Normal。
    half3 Emission。
    fixed Alpha。
    half Occlusion。
    half Smoothness。
    fixed3 Specular:表示高光颜色,与SurfaceOutput结构中的Specular属性有很大不同,这里可以指定一种颜色而非单一值。
    正确使用表面着色器很重要的一点是用正确的值初始化表面输出结构。

转载地址:http://fseal.baihongyu.com/

你可能感兴趣的文章
Python 代码规范
查看>>
DNS服务的配置与管理(2) DNS的理论知识
查看>>
安装rmp包,创建yum仓库,和制作yum源的前提条件是挂载光盘
查看>>
管道的内部结构
查看>>
360笔试---linux分区 目录 挂载点
查看>>
su命令、sudo命令、限制root远程登录
查看>>
我的友情链接
查看>>
ATS代码分析概述
查看>>
eclipse安装问题
查看>>
员工管理系统
查看>>
看我说PHP之文件上传
查看>>
WHATWG
查看>>
Java基础异常
查看>>
高级网络控制
查看>>
Lintcode40 Implement Queue by Two Stacks solution 题解
查看>>
Mysql_MHA高可用架构搭建
查看>>
聚合链接和防火墙策略管理(初级)
查看>>
Wireshark数据包分析之IP协议包解读
查看>>
网络工程师成长日记121-网管始终都是网管
查看>>
Java基础概述
查看>>