Unity Shader 基础
推荐:
https://www.cnblogs.com/nanwei/p/7277417.html
上面链接作者的整个系列都写的不错
https://www.cnblogs.com/nanwei/category/1025420.html
【Unity Shader】---数据类型和关键字
一、基本数据类型:Cg支持7种基本的数据类型
1、float,32位浮点数据,一个符号位。浮点数据类型被所有的图形接口支持;
2、half,16位浮点数据;
3、int,32位整形数据
4,fixed,12位定点数,
5、bool,布尔数据,被所有的图形接口支持;
6、sampler*,纹理对象的句柄,分为sampler、sampler1D、sampler2D、sampler3D、samplerCUBE和samplerRECT。
二、内置的数据类型
基于基础数据类型,如float3,表示float类型的三维向量;同理,bool2表示布尔类型的二维向量。
注:向量最长不能超过四元,如float5 vector;//编译错误
向量的赋值:
float2 a=float(1.0,1.0); //编译通过
float2 a=float(1.0f,1.0f); //编译错误
float3 b=float(a,0.0); //编译通过
矩阵数据类型:
float1X1 m1; //即float m1,一维矩阵
float3X4 m34 //3*4阶矩阵
注:X是字符,不是乘号,最大的维数为4*4阶,矩阵的初始化 float 2*2 m22={1.0,2.0,3.0,2.3};
float3 x和floatx[3]是不同的,前者为向量是内置的数据类型,而数组则是一种数据结构,不是内置的数据类型。
三、类型转换
Cg中的类型转换有强制转换和隐式转换;如果是隐式转换则数据类型从低精度向高精度转换。如:
float a=1.0; half b=2.0; loat c=a+b; //等价于float c=a+(float)b;
Cg语言中可以对常量数据加上类型后缀表示该数据类型的数据,如:
float a=1.0h; //1.0h为half类型常量数据
这样的后缀类型有三种:
f:表示float;
h:表示half;
x:表示fixed;
四、Swizzle操作符
Cg语言中的其他操作符和高级CPU语言C++类似,包括关系操作符、逻辑操作符和位移操作符以及条件操作符。而Swizzle操作符是Cg语言中特有的,它可以将一个向量的成员取出组成一个新的向量。对于坐标或者角度等其他多维向量,Swizzle操作符(.)后接x、y、z、w分别表示原始向量的第一个、第二个、第三个和第四个元素;同样,对于颜色可以后接r、g、b和a来表示同样的索引。
例如:
float4(a,b,c,d).xwz 等价于 float(a,d,c)
float4(a,b,c,d).xxy 等价于 float(a,a,b)
注:Swizzle操作符只对结构体和向量使用,不能对数组使用。
五、输入数据关键字:Cg中输入数据流一般分为两类
1、varying 参数:在Cg程序中通过语义进行绑定变量, Cg语言提供了一组语义词,用以表示参数是由顶点的那些数据初始化的,一旦这个变量使用了语义词进行绑定,那么这个变量值被初始化的同时也意味着它有了特殊的含义,如表示位置、法线等含义。语义提供了一种使用随顶点变化或随片段变化而变化的值来初始化Cg程序参数的方法,这些数据都是从应用程序输入到GPU的数据,如顶点位置、法向量、纹理坐标数据等。
2、Uniform 参数:Uniform是用来限制一个变量的初始值的来源,当声明一个变量为Uniform类型的时候,表示这个变量的初始值来自于外部的其他环境。除了获取初始值的这点之外,Uniform关键字声明的变量和其他变量是完全一样的。通常用Uniform来定义一些与三维渲染有关的离散信息数据,并通常不会随着图元信息的变化而变化,如材质对光的反射信息。Uniform表示一个参数,通常使用 uniform表示函数的形参,不能定义一个uniform表示的局部变量。
Unity的内置Uniform输入参数如下:
uniform float4 _Time, _SinTime, _CosTime; // 时间量
uniform float4 _ProjectionParams; // x = 1 or -1 (如果投影翻转就是-1)
// y = 近平面; z = 远平面; w = 1/远平面
uniform float4 _ScreenParams; // x = width; y = height; z = 1 +1/width; w = 1 + 1/height
uniform float3_WorldSpaceCameraPos;
uniform float4x4 _Object2World; //模型矩阵
uniform float4x4 _World2Object; // 模型矩阵的逆
uniform float4 _LightPositionRange; // xyz = pos, w = 1/range
uniform float4 _WorldSpaceLightPos0; // 光源的位置和方向
uniform float4x4 UNITY_MATRIX_MVP; // 模型视图投影矩阵
uniform float4x4 UNITY_MATRIX_MV; // 模型视图矩阵
uniform float4x4 UNITY_MATRIX_V; // 视图矩阵
uniform float4x4 UNITY_MATRIX_P; // 投影矩阵
uniform float4x4 UNITY_MATRIX_VP; // 视图投影矩阵
uniform float4x4 UNITY_MATRIX_T_MV; // 模型视图矩阵的转置矩阵
uniform float4x4 UNITY_MATRIX_IT_MV; // 模型视图矩阵的逆矩阵的转置矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE0; // 贴图纹理矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE1; //贴图纹理矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE2; //贴图纹理矩阵
uniform float4x4 UNITY_MATRIX_TEXTURE3; //贴图纹理矩阵
uniform float4 UNITY_LIGHTMODEL_AMBIENT; // 环境色
六、输入输出
对于程图形渲染管线,可编程控制的部分只有两个,顶点着色器和片段着色器。对于编程控制这两个部分,首要的任务就是要怎么给它们传参数。Cg语言的参数传递同样也有“值传递”和“引用传递”之分。因为GPU不支持指针,所以Cg语言采用了如下的方式来修辞参数传递:
1、in:修辞一个形参只是用于输入,进入函数体时被初始化,且该形参值的改变不会影响实参值,传递方式为值传递。
2、out:修辞一个形参只是用于输出,进入函数体时没有被初始化,一般为函数的返回值。
3、inout:修辞一个形参即用于输入也用于输出,这是典型的引用传递。
Unity Shader 基础的更多相关文章
- Unity Shader 基础(4) 由深度纹理重建坐标
在PostImage中经常会用到物体本身的位置信息,但是Image Effect自身是不包含这些信息的,因为屏幕后处其实是使用特定的材质渲染一个刚好填满屏幕的四边形面片(四个角对应近剪裁面的四个角). ...
- Unity Shader基础
Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...
- Unity Shader入门精要学习笔记 - 第3章 Unity Shader 基础
来源作者:candycat http://blog.csdn.net/candycat1992/article/ 概述 总体来说,在Unity中我们需要配合使用材质和Unity Shader才能达 ...
- 第二章 Unity Shader基础
[TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...
- Unity Shader 基础(3) 获取深度纹理
Unity提供了很多Image Effect效果,包含Global Fog.DOF.Boom.Blur.Edge Detection等等,这些效果里面都会使用到摄像机深度或者根据深度还原世界坐标实现各 ...
- Unity Shader 基础(1): RenderType & ReplacementShader
很多Shader中都会定义RenderType这个类型,但是一直搞不明白到底是干嘛的,官方文档是这样结解释的:Rendering with Replaced Shaders Rendering wit ...
- Unity Shader基础(1):基础
一.Shaderlab语法 1.给Shader起名字 Shader "Custom/MyShader" 这个名称会出现在材质选择使用的下拉列表里 2. Properties (属性 ...
- Unity Shader 基础(2) Image Effect
Unity中 Image Effect 是Post Processing的一种方,Unity自身也提供很多Effect效果供使用.Image Effect的使用官方文档做了很多介绍,这里重点Post ...
- Unity Shader基础:编译指令
UntiyShader中,编译指令分为两种: 1.顶点片元着色器(Vetex & Fragment Shader)使用的编译指令 2.表面着色器(Surface Shader)使用的编译指令 ...
随机推荐
- 磁盘IO及性能指标
一.磁盘 I/O 的概念 I/O 的概念,从字义来理解就是输入输出.操作系统从上层到底层,各个层次之间均存在 I/O.比如,CPU 有 I/O,内存有 I/O, VMM 有 I/O, 底层磁盘上也有 ...
- thinkPHP5.0.22初体验---request相关用法
如果浏览器要返回美观排列的json数据,可以安装火狐浏览器的插件 返回XML的数据格式 渲染模板的用法 return $this->fetch('index/index2')效果 扒掉stirp ...
- 01-01 Web应用
一 Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览 ...
- Oracle存储结构-段区块
段 一个段建立以后首先会分配一个区,区中包括含8个块,这时执行insert插入数据,当这个区写满后,会在分配一个区 1.一个段建立以后,Oracle如何给段分配区? 2.段分配到区以后,有了空闲空间, ...
- 通用DES加密解密方法
/// <summary> /// DES加密方法 /// </summary> /// <param name="strPlain">明文&l ...
- Confluence 6 多媒体文件和在页面中显示文件列表
多媒体文件 文件的预览同时也支持 MP3 音频和 MP4 视频文件.Confluence 使用 HTML 5 来播放附加的音频和视频文件.这个意味着这些文件类型的文件格式,用户可以在支持的浏览器中直接 ...
- HGOI20190706 题解
Problem A 质因数 设f(x) 表示x的不同质因子个数,给出T组x,询问f(x)的值. 对于100%的数据 $x,T \leq 10^5 $ Sol : 第一遍欧拉筛,并记录下每个数的最小质因 ...
- Springboot 系列(十七)迅速使用 Spring Boot Admin 监控你的 Spring Boot 程序,支持异常邮件通知
1. Spring Boot Admin 是什么 Spring Boot Admin 是由 codecentric 组织开发的开源项目,使用 Spring Boot Admin 可以管理和监控你的 S ...
- [CSP-S模拟测试]:小盆友的游戏(数学 or 找规律)
题目传送门(内部题110) 输入格式 第一行一个整数$N$,表示小盆友的个数. 第二行$N$个整数$A_i$,如果$A_i=-1$表示$i$目前是自由身,否则$i$是$A_i$的跟班. 输出格式 一个 ...
- vi 学习
1,光标移动 1)h:左:l:右:j:下:k:上:和方向键不同的是,不会造成折行 2)0:行首:$行尾:G:最后一行第一个字符;gg:第一行第一个字符:^:本行第一个非空白字符:H:移至屏幕第一个字符 ...