Shader的函数公式以及使用的场景
Shader 是干什么的?
它的作用可以先简单理解为对屏幕上的物体,进行颜色处理。
而大家都知道,所有计算机,处理颜色的当然是显卡,也就是 GPU 。
所以我们写 Shader 的目的就是告诉 GPU ,我需要对物体的颜色,纹理,等方面,怎样处理,达到我们想要的效果。
UnityCG.cginc中一些常用的函数
//摄像机方向(视角方向)
float3 WorldSpaceViewDir(float4 v) 根据模型空间中的顶点坐标 得到 (世界空间)从这个点到摄像机的观察方向
float3 UnityWorldSpaceViewDir(float4 v) 世界空间中的顶点坐标==》世界空间从这个点到摄像机的观察方向
float3 ObjSpaceViewDir(float4 v) 模型空间中的顶点坐标==》模型空间从这个点到摄像机的观察方向
//光源方向
float3 WorldSpaceLightDir(float4 v) 模型空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 UnityWorldSpaceLightDir(float4 v) 世界空间中的顶点坐标==》世界空间中从这个点到光源的方向
float3 ObjSpaceLightDir(float4 v) 模型空间中的顶点坐标==》模型空间中从这个点到光源的方向
//方向转换
float3 UnityObjectToWorldNormal(float3 norm) 把法线方向 模型空间==》世界空间
float3 UnityObjectToWorldDir(float3 dir) 把方向 模型空间=》世界空间
float3 UnityWorldToObjectDir(float3 dir) 把方向 世界空间=》模型空间
什么是OpenGL、DirectX
shader可以认为是一种渲染命令 ,由opengl 或者dx进行解析,来控制渲染丰富多彩的图形
OpenGL 使用GLSL 编写shader
DirectX 使用HSSL 编写shader
英伟达 CG 编写shader(跨平台)
Unity Shader的分类
使用的是ShaderLab编写Unity中的Shader
1,表面着色器 Surface Shader
2,顶点/片元着色器 Vertex/Fragment Shader
3,固定函数着色器 Fixed Function Shader
Unityshader中属性的类型有哪些
_Color(“Color”,Color)=(1,1,1,1)
_Vector(“Vector”,Vector)=(1,2,3,4)
_Int(“Int”,Int)= 34234
_Float(“Float”,Float) = 4.5
_Range(“Range”,Range(1,11))=6
_2D(“Texture”,2D) = “red”{}
_Cube(“Cube”,Cube) = “white”{}
_3D(“Texure”,3D) = “black”{}
从应用程序传递到顶点函数的语义有哪些a2v
POSITION 顶点坐标(模型空间下的)
NORMAL 法线( 模型空间下)
TANGENT 切线(模型空间)
TEXCOORD0 ~n 纹理坐标
COLOR 顶点颜色
从顶点函数传递给片元函数的时候可以使用的语义
SV_POSITION 剪裁空间中的顶点坐标(一般是系统直接使用)
COLOR0 可以传递一组值 4个
COLOR1 可以传递一组值 4个
TEXCOORD0~7 传递纹理坐标
片元函数传递给系统
SV_Target 颜色值,显示到屏幕上的颜色
什么是光照模型
光照模型就是一个公式,使用这个公式来计算在某个点的光照效果
标准光照模型
在标准光照模型里面,我们把进入摄像机的光分为下面四个部分
自发光
高光反射
Blinn光照模型
Specular=直射光 * pow( max(cosθ,0),10) θ:是反射光方向和视野方向的夹角
Blinn-Phong光照模型
Specular=直射光 * pow( max(cosθ,0),10) θ:是法线和x的夹角 x 是平行光和视野方向的平分线
漫反射 Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向
环境光
Tags{ “LightMode”=”ForwardBase” }
只有定义了正确的LightMode才能得到一些Unity的内置光照变量
include “Lighting.cginc”
包含unity的内置的文件,才可以使用unity内置的一些变量
normalize() 用来把一个向量,单位化(原来方向保持不变,长度变为1)
max() 用来取得函数中最大的一个
dot 用来取得两个向量的点积
_WorldSpaceLightPos0 取得平行光的位置
_LightColor0取得平行光的颜色
UNITY_MATRIX_MVP 这个矩阵用来把一个坐标从模型空间转换到剪裁空间
_World2Object 这个矩阵用来把一个方向从世界空间转换到模型空间
UNITY_LIGHTMODEL_AMBIENT用来获取环境光
半兰伯特光照模型
Diffuse = 直射光颜色 *( cosθ *0.5 +0.5 )
兰伯特光照模型
Diffuse = 直射光颜色 * max(0,cos夹角(光和法线的夹角) ) cosθ = 光方向· 法线方向
shader中的各种空间坐标
http://blog.csdn.net/lyh916/article/details/50906272
什么是切线空间
http://blog.csdn.net/bonchoix/article/details/8619624
pixel = (normal+1)/2
normal = pixel*2 - 1
Shader的函数公式以及使用的场景的更多相关文章
- 工作中最常用的Excel函数公式大全
电脑那些事儿2016-05-18 22:23:02微软 公式 工作阅读(22574)评论(1) 声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场.举报 Wo ...
- python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域
复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参: -- 形参:在函数定义时()中出现的参数 ...
- 数论的欧拉定理证明 & 欧拉函数公式(转载)
欧拉函数 :欧拉函数是数论中很重要的一个函数,欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) . 完全余数集合:定义小于 n 且和 n 互质的数 ...
- 巧妙使用MathType快速编写数学函数公式
在我们日常的工作与学习中,你是否也会遇到过无法在电脑中编写数学函数公式的情况呢? 简单的数学函数公式或许经过我们不懈的努力也可以成功的编写,不过这会耽误我们大把的时间. 想象一下,假如你的老板急着催你 ...
- unity shader 常用函数列表
此篇博客转自csdn的一位大牛. 中间排版出了一些问题 Intrinsic Functions (DirectX HLSL) The following table lists the intrins ...
- [ExcelHome]15个常用的Excel函数公式,拿来即用
微软最有价值专家(MVP)祝洪忠分享15个模式化的表格公式,大家有类似问题可以直接套用. 首先声明,我这个可称不上是什么公式大全,就是给各位新人朋友们入门学习的,高手请按返回键. 1.查找重复内容 = ...
- Unity3D -- shader常用函数和变量
最近在学习Unity Shader,写Shader的时候总是忘记Unity为我们提供的函数.变量怎么写的,这里整理一下,方便自己查阅,也提供给网友,学习Shader不易. 1.函数 float3 Wo ...
- 常用excel函数公式及操作示例
一.数字处理 1.取绝对值 =ABS(数字) 2.取整 =INT(数字) 3.四舍五入 =ROUND(数字,小数位数) 二.判断公式 1.把公式产生的错误值显示为空 公式:C2 =IFERROR(A2 ...
- Shader 001 - 函数造型能力
0x00 从函数出发 Shader 中的很多效果都是由函数计算得出的,如何更好地理解二者的关系呢.不妨先看看函数是什么?函数的定义可以简单地描述为:给定一个集合 A,对于其中的元素施加法则 f,则可以 ...
随机推荐
- 03_ExeZZ.cpp
1.静态加载 DLL : #pragma comment(lib, "DllZZ.lib") __declspec(dllimport) void __stdcall AA(); ...
- Linux中CentOS6.5 64位 系统下安装docker步骤
CentOS6.5 64位 (docker目前仅支持64位)内核必须在3.10及以上 1. uname -r 查看内核版本 2. 升级内核到3.10版本(带aufs模块) cd /etc ...
- js的单双引号
单引号开始: 有时候上边的不行 双引号开始. 一般最外边是单引号 属性是双引号. 如果属性中还是需要一个属性的话,那么我们用\“,里边用‘+data.id+'来区分. 今天又一次遇到一次单双引号,花了 ...
- spring boot 2.0 + 静态资源被拦截,怎么办?
问题描述:使用springboot 2.0后,按照springboot 1.5版本(以下简称旧版)的方式去配置项目.结果发现静态资源访问不到了,本文对此情况分析.处理 项目结构: 直接上图 如果是在旧 ...
- 词向量-LRWE模型-更好地识别反义词同义词
上一节,我们介绍利用文本和知识库融合训练词向量的方法,如何更好的融合这些结构化知识呢?使得训练得到的词向量更具有泛化能力,能有效识别同义词反义词,又能学习到上下文信息还有不同级别的语义信息. 基于上述 ...
- Confluence 6 嵌套用户组的备注
潜在的性能影响.启用嵌套用户组可能会减慢用户查找的速度. 在 LDAP 中定义嵌套用户组.在 LDAP 中,一个嵌套用户组是 DN (Distinguished Name)的子用户组,这个字用户组将会 ...
- 删除php数组中的元素
删除一个元素,且保持原有索引不变 使用 unset 函数,示例如下: <?php $array = array(0 => "a", 1 => "b&qu ...
- 基础最短路(模板 dijkstra)
Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路多了也不好,每次要从一个城镇到另一个城镇时,都有许多种道路方案可以选择,而某些方案要比另一些方案行走的距离要短很多 ...
- OC 点语法和变量作用域
一.点语法 (一)认识点语法 声明一个Person类: 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObje ...
- SSH 远程端口转发
既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发. 还是接着看上面那个例子,ho ...