紧接上一篇:https://blog.csdn.net/yinhun2012/article/details/80924102

上一篇我们用cg中比较常见的vertex fragment函数去实现了通用光照模型的效果,功能和效果虽然很详细的实现了,但是从代码复用性来讲,不那么友好,这次就按照unity cg编译器的规范去实现一个通用光照模型的函数。

首先为了系统的学习unity cg的一些自定义代码规则,我们需要先去下载unity cgbuildin文件,具体下载方法就是去unity官网选择unity旧版本,然后选择要下载的unity版本的内置着色器文件,截图和地址如下:

unity文件下载

因为我暂时用的5.x版本,所以一切以5.x版本来讲解,下载完毕后打开CGIncludes文件夹,其中有很多.cginc文件,这些就是unity编译器能识别编译的c源码文件,这些源码文件的作用就很大了:

①.让你查看unity内部着色器这块一些实现代码。

②.因为这些代码包含我们编写.shader文件的函数接口和数据结构,比如UnityCG.cginc这个代码文件,可以很清晰的看出.shader文件中使用的各种数据结构体和字段,以及各种计算辅助函数。

③.再比如打开UnityStandardInput.cginc这个文件(以及其包含的头文件),可以看到很多.shader中使用的数据定义以及其含义。

...

因为文件太多暂时讲不完,我会在额外开一个unity c for graphic栏目详细讲解,这个栏目会从基础语法到unity着色器源码进行学习。

言归正传,接下来找到UnityPBSLighting.cginc打开,你会看到一个名为SurfaceOutputStandard的结构体,结构体的如下:

上面的注释写着用于物理上的表面着色器输出结构体。

顺便看下结构体下面的LightingStandard函数,如下图:

这就是一个unity自定义的标准光照通用函数。这个函数具体怎么用呢?我就来写CGshader代码演示一下,如下图:

Shader "Custom/StandardSurfaceShader" {Properties {_Color ("Color", Color) = (1,1,1,1)_MainTex ("Texture", 2D) = "white" {}_Glossiness ("Smoothness", Range(0,1)) = 0.5_Metallic ("Metallic", Range(0,1)) = 0.0}SubShader {Tags { "RenderType"="Opaque" }CGPROGRAM#pragma surface surf Standard#include "UnityPBSLighting.cginc"#pragma target 3.0struct Input {float2 uv_MainTex;};sampler2D _MainTex;half _Glossiness;half _Metallic;fixed4 _Color;void surf (Input IN, inout SurfaceOutputStandard o) {fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;o.Metallic = _Metallic;o.Smoothness = _Glossiness;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"
}

这里我就要详细讲解一下这个标准StandardSurfaceShader一些让人迷惑的地方。

1.Properties字段定义

①._Color,定义材质基本颜色

②._MainTex,材质表面贴图

③._Glossiness,材质表面平滑性

④._Metallic,材质金属光泽

2.#pragma surface surf Standard预处理指令,这个是什么意思呢?作用和c预处理指令一样,语法上经过了unity自己的着色器编译器的规范化处理,比如surface代表我这是一个surface着色函数,surf就是需要调用的程序员们实现的函数,Standard就是标准光照模型LightingStandard,这里特别提示一下,这个就是unity官方自己的编译规范,Standard隐去了Lighting这个字符串,实际上就是LightingStandard,可以这么说,官方就是这么任性,就是要去掉Lighting前缀,不爽咬我啊!

3.Surf函数

①.SurfaceOutputStandard这个参数的作用就很大了,这是unity标准光照模型LightingStandard处理需要的封装结构体,结构体数据我上面有截图,可以翻上去详细看一下。

②.inout形参修饰符,这个修饰符的作用跟c#的ref out差不多,直接传递一个引用结构体给我们填充数据,填充完毕就被拿回去使用。

③.我们将SurfaceOutputStandard的几个重要参数填充完毕后,提交给标准光照模型LightingStandard去计算最终光照效果。

最后发下,这个标准surface着色器的最终效果,如下图:

可以明显感觉到这些参数提供的具体效果变化。

最后,当我们学习理解完毕这种cg写法后,下一篇我们要自己实现通用自定义光照模型,亲自感受一下。

入门图形学:光照模型(四)相关推荐

  1. 【深度学习】翻译:60分钟入门PyTorch(四)——训练一个分类器

    前言 原文翻译自:Deep Learning with PyTorch: A 60 Minute Blitz 翻译:林不清(https://www.zhihu.com/people/lu-guo-92 ...

  2. WPF入门教程系列四——Dispatcher介绍

    WPF入门教程系列四--Dispatcher介绍 一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还 ...

  3. Oracle入门(十四)之PL/SQL

    一.PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展. (1) (2) (3) (5) (6) (7)数据类型 Number 数字型 Varchar2 ...

  4. MVC5+EF6 入门完整教程四

    MVC5+EF6 入门完整教程四 原文:MVC5+EF6 入门完整教程四 上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model à 创建Database Context à创 ...

  5. OllyDBG 入门系列(四)-内存断点

    [原创]OllyDBG 入门系列(四)-内存断点 <!-- PHPForce - Joey修改性别 --><!-- /PHPForce - Joey修改性别 --> <! ...

  6. ROS入门笔记(四):ROS实践(小海龟仿真)— ROS Topics

    ROS入门笔记(四):ROS实践(小海龟仿真)- ROS Topics 文章目录 1 基础知识 1.1 运行ROS Master所在主机的资源地址 1.2 ROS常用命令 1.2.1 查看所有以ros ...

  7. 【知识整理】这可能是最好的RxJava 2.x 入门教程(四)

    这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(完结版)[强力推荐] 这可能是最好的RxJava 2.x 入门教程(一) 这可能是最好的R ...

  8. 深度学习入门笔记(四):神经网络

    专栏--深度学习入门笔记 推荐文章 深度学习入门笔记(一):机器学习基础 深度学习入门笔记(二):神经网络基础 深度学习入门笔记(三):感知机 深度学习入门笔记(四):神经网络 深度学习入门笔记(五) ...

  9. 机器学习入门笔记(四):朴素贝叶斯分类

    文章目录 一.朴素贝叶斯法 1.1 实现原理 1.2 后验概率最大化 二.朴素贝叶斯法的参数估计 2.1 极大似然估计 2.2 学习与分类算法 2.3 朴素贝叶斯分类器例题 2.4 贝叶斯估计 推荐文 ...

  10. 【Git入门之十四】Git GUI

    [Git入门之十四]Git GUI - JackyStudio - 博客频道 - CSDN.NET 文章都快写完了,Git GUI才浮出水面,很多人要骂我,这么方便的东西怎么不早拿出来. 当然命令行和 ...

最新文章

  1. android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录
  2. jenkins 忘记密码_持续集成工具Jenkins 在CentOS系统下安装
  3. Zookeeper+kafka集群搭建,问题(zoo.cfg file is running,it‘s probably not running,option ‘UseCompressedOops‘)
  4. (九)数据结构之“图”
  5. 13计算机组装,计算机组装与维修—教案13 .pdf
  6. 搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )
  7. K-means聚类分析算法(二)
  8. 洛谷——P2637 第一次,第二次,成交
  9. python处理中文编码问题总结
  10. 150分试卷c语言,连续5道C语言题目一共送150分啊,题目2.一个农场有头母牛,现 爱问知识人...
  11. 人生苦短我用python(02)动态加载模块
  12. nagios常见错误及页面错误
  13. 机器学习 Machine Learning- 吴恩达Andrew Ng 第6~10课总结
  14. javaWeb详细教程
  15. 当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
  16. gitlab 屏蔽注册功能
  17. (原创)虚拟机下Ubuntu共享主机文件(Ubuntu、VMware、共享)
  18. hdu5651 xiaoxin juju needs help(组合数学)
  19. 员工激励格言之《士气与斗志的激励》
  20. matlab 提取谐波,用MATLAB采用MUSIC法进行谐波提取出现问题

热门文章

  1. 【编程学习】浅谈哈希表及用C语言构建哈希表!
  2. Vim常用技巧--查看不可见字符
  3. 《Python编程:从入门到实践》读书笔记:第15章 生成数据
  4. 史上最严数据保护条例欧盟GDPR今日生效,你可能需要这版中文全文(下)
  5. SDN(Software Defined Network) 软件定义网络学习
  6. Linux服务器Redis 6.x安装、配置
  7. Python中的append()方法
  8. ML之ME:Best-KS分箱/KS值(分类预测问题中评价指标、数据分箱方法)的简介(KS与ROC的关系)、使用方法、案例应用之详细攻略
  9. 刘鹏教授接受新华日报财经客户端采访:智能制造应用落地生根,“江苏智造”进入快速增长期...
  10. Linux 压缩、解压缩命令