入门图形学:光照模型(四)
紧接上一篇: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写法后,下一篇我们要自己实现通用自定义光照模型,亲自感受一下。
入门图形学:光照模型(四)相关推荐
- 【深度学习】翻译:60分钟入门PyTorch(四)——训练一个分类器
前言 原文翻译自:Deep Learning with PyTorch: A 60 Minute Blitz 翻译:林不清(https://www.zhihu.com/people/lu-guo-92 ...
- WPF入门教程系列四——Dispatcher介绍
WPF入门教程系列四--Dispatcher介绍 一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还 ...
- Oracle入门(十四)之PL/SQL
一.PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展. (1) (2) (3) (5) (6) (7)数据类型 Number 数字型 Varchar2 ...
- MVC5+EF6 入门完整教程四
MVC5+EF6 入门完整教程四 原文:MVC5+EF6 入门完整教程四 上篇文章主要讲了如何配置EF, 我们回顾下主要过程: 创建Data Model à 创建Database Context à创 ...
- OllyDBG 入门系列(四)-内存断点
[原创]OllyDBG 入门系列(四)-内存断点 <!-- PHPForce - Joey修改性别 --><!-- /PHPForce - Joey修改性别 --> <! ...
- ROS入门笔记(四):ROS实践(小海龟仿真)— ROS Topics
ROS入门笔记(四):ROS实践(小海龟仿真)- ROS Topics 文章目录 1 基础知识 1.1 运行ROS Master所在主机的资源地址 1.2 ROS常用命令 1.2.1 查看所有以ros ...
- 【知识整理】这可能是最好的RxJava 2.x 入门教程(四)
这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(完结版)[强力推荐] 这可能是最好的RxJava 2.x 入门教程(一) 这可能是最好的R ...
- 深度学习入门笔记(四):神经网络
专栏--深度学习入门笔记 推荐文章 深度学习入门笔记(一):机器学习基础 深度学习入门笔记(二):神经网络基础 深度学习入门笔记(三):感知机 深度学习入门笔记(四):神经网络 深度学习入门笔记(五) ...
- 机器学习入门笔记(四):朴素贝叶斯分类
文章目录 一.朴素贝叶斯法 1.1 实现原理 1.2 后验概率最大化 二.朴素贝叶斯法的参数估计 2.1 极大似然估计 2.2 学习与分类算法 2.3 朴素贝叶斯分类器例题 2.4 贝叶斯估计 推荐文 ...
- 【Git入门之十四】Git GUI
[Git入门之十四]Git GUI - JackyStudio - 博客频道 - CSDN.NET 文章都快写完了,Git GUI才浮出水面,很多人要骂我,这么方便的东西怎么不早拿出来. 当然命令行和 ...
最新文章
- android sd卡列目录文件_Android正确获取SD卡目录及使用SD卡目录
- jenkins 忘记密码_持续集成工具Jenkins 在CentOS系统下安装
- Zookeeper+kafka集群搭建,问题(zoo.cfg file is running,it‘s probably not running,option ‘UseCompressedOops‘)
- (九)数据结构之“图”
- 13计算机组装,计算机组装与维修—教案13 .pdf
- 搜索算法(三)--DFS/BFS求解宝岛探险问题(JAVA )
- K-means聚类分析算法(二)
- 洛谷——P2637 第一次,第二次,成交
- python处理中文编码问题总结
- 150分试卷c语言,连续5道C语言题目一共送150分啊,题目2.一个农场有头母牛,现 爱问知识人...
- 人生苦短我用python(02)动态加载模块
- nagios常见错误及页面错误
- 机器学习 Machine Learning- 吴恩达Andrew Ng 第6~10课总结
- javaWeb详细教程
- 当下最强的 AI art 生成模型 Stable Diffusion 最全面介绍
- gitlab 屏蔽注册功能
- (原创)虚拟机下Ubuntu共享主机文件(Ubuntu、VMware、共享)
- hdu5651 xiaoxin juju needs help(组合数学)
- 员工激励格言之《士气与斗志的激励》
- matlab 提取谐波,用MATLAB采用MUSIC法进行谐波提取出现问题
热门文章
- 【编程学习】浅谈哈希表及用C语言构建哈希表!
- Vim常用技巧--查看不可见字符
- 《Python编程:从入门到实践》读书笔记:第15章 生成数据
- 史上最严数据保护条例欧盟GDPR今日生效,你可能需要这版中文全文(下)
- SDN(Software Defined Network) 软件定义网络学习
- Linux服务器Redis 6.x安装、配置
- Python中的append()方法
- ML之ME:Best-KS分箱/KS值(分类预测问题中评价指标、数据分箱方法)的简介(KS与ROC的关系)、使用方法、案例应用之详细攻略
- 刘鹏教授接受新华日报财经客户端采访:智能制造应用落地生根,“江苏智造”进入快速增长期...
- Linux 压缩、解压缩命令