书看到第八章,跟随写了一些例子,但有些数值类型的使用还是需要特别注意,经常需要查阅,在这里做一下总结。

1 ShaderLab属性类型和Cg变量类型的匹配关系

Color、Vector:float4,half4,fixed4

Range、Float:float, half, fixed

2D:sampler2D

3D:sampler3D

Cube:samplerCube

Int:int(32位整型数据)

注意:这些属性类型是在定义属性时使用,例如:

  1. Shader "Unlit/Test Shader"
  2. {
  3. Properties
  4. {
  5. _Color ("Color Tint", Color) = (, , , )
  6. _MainTex ("Main Tex", 2D) = "white" {}
  7. _BumpMap ("Normal Map", 2D) = "bump" {}
  8. _BumpScale ("Bump Scale", Float) = 1.0
  9. _SpecularMask ("Specular Mask", 2D) = "white" {}
  10. _SpecularScale ("Specular Scale", Float) = 1.0
  11. _Specular ("Specular", Color) = (, , , )
  12. _Gloss ("Gloss", Range (8.0, 256.0)) = 20.0
  13. }
  14. SubShader{
    Pass{
    ......
    }
  15. }

2 Cg/HLSL常用的3种精度的数值类型

float: 32位存储,用在坐标、未归一化的矢量、uv、一些调整参数

half:16位存储,范围 -60000~60000

fixed:11位存储,范围-2.0~2.0,用于存储颜色、归一化后的矢量、在这个范围内的参数等

注意:uv不能用fixed存储,因为可能通过贴图的Tiling和Offset让其范围超过[0, 1]

  1. fixed4 _Color;
  2. sampler2D _MainTex;
  3. float4 _MainTex_ST;
  4. sampler2D _BumpMap;
  5. float _BumpScale;
  6. sampler2D _SpecularMask;
  7. float _SpecularScale;
  8. fixed4 _Specular;
  9. float _Gloss;
  10.  
  11. struct a2v
  12. {
  13. float4 vertex : POSITION;
  14. float3 normal : NORMAL;
  15. float4 tangent : TANGENT;
  16. float4 texcoord : TEXCOORD0;
  17. };
  18.  
  19. struct v2f
  20. {
  21. float4 pos : SV_POSITION;
  22. float2 uv : TEXCOORD0;
  23. float3 lightDir : TEXCOORD1;
  24. float3 viewDir : TEXCOORD2;
  25. };
  26.  
  27. v2f vert (a2v v)
  28. {
  29. v2f o;
  30. ......
  31. return o;
  32. }
  33.  
  34. fixed4 frag (v2f i) : SV_Target
  35. {
  36. ......
  37. return fixed4(ambient + diffuse + specular, 1.0);
  38. }

3 Unity Shader常用语义(寄存器)

就是上面这段代码中的标红部分。它代表了前面那个变量从哪里获得数据或者存储到哪里。

3.1 从应用阶段传递模型数据给顶点着色器时:

POSITION:模型空间中的顶点位置,通常是float4类型

NORMAL:顶点法线,通常是float3类型

TANGENT:顶点切线,通常是float4类型,第四个分量用于存储特殊数值

TEXCOORDn:顶点纹理坐标,通常是float2或float4类型。在Unity Model2和3中,n=8(Unity默认),在4和5中n=16.

COLOR:顶点颜色,通常是fixed4或float4类型

3.2 从顶点着色器传递给片元着色器时:

SV_POSITION:裁剪空间中的顶点坐标,结构体中必须包含一个用该语义的变量

COLOR0:输出第一组顶点颜色,不必需

COLOR1:输出第二组顶点颜色,不必需

TEXCOORD0~7:输出纹理坐标,不必需

3.3 片元着色器输出:

SV_Target: 输出值将会存储到渲染目标(render target)中

注意:一个语义可以使用的寄存器最多只能处理4个浮点值(float),因此对于4x4矩阵,需要拆分成4个float4类型的变量来存储矩阵数据

4 Unity Shader常用函数

  

  1. float3 WorldSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向
  2.  
  3. float3 ObjSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向
  4.  
  5. float3 WorldSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化
  6.  
  7. float3 UnityWorldSpaceLightDir(float4 v) //仅可用于前向渲染中,输入一个世界空间的顶点位置,返回世界空间从该点到光源的光照方向,没有被归一化
  8.  
  9. float3 ObjSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向,没有被归一化
  10.  
  11. float3 UnityObjectToWorldNormal(float3 norm) //把法线从模型空间转换到世界空间中
  12.  
  13. float3 UnityObjectToWorldDir(in float3 dir) //把方向矢量从模型空间转换到世界空间中
  14.  
  15. float3 UnityWorldToObjectDir(float3 dir) //把方向矢量从世界空间转换到模型空间中
  16.  
  17. float3 Shade4PointLights(...) //仅可用于前向渲染中,计算四个点光源的光照,它的参数是已经打包进矢量的光照数据。前向渲染通常会使用这个函数来计算逐顶点光照
  18. ---------------------
  19. 作者:honey199396
  20. 来源:CSDN
  21. 原文:https://blog.csdn.net/honey199396/article/details/54574254
  22. 版权声明:本文为博主原创文章,转载请附上博文链接!

5 Unity Shader 变量

  1. UNITY_MATRIX_MVP //当前的模型*观察*投影矩阵,用于将顶点/方向矢量从模型空间转换到裁剪空间
  2.  
  3. UNITY_MATRIX_MV //当前的模型*观察矩阵,用于将顶点/方向矢量从模型空间转换到观察空间
  4.  
  5. UNITY_MATRIX_V //当前的观察矩阵,用于将顶点/方向矢量从世界空间转换到观察空间
  6.  
  7. UNITY_MATRIX_P //当前的投影矩阵,用于将顶点/方向矢量从观察空间转换到裁剪空间
  8.  
  9. UNITY_MATRIX_VP //当前的观察*投影矩阵,用于将顶点/方向矢量从世界空间转换到裁剪空间
  10.  
  11. UNITY_MATRIX_T_MV //UNITY_MATRIX_MV的转置矩阵
  12.  
  13. UNITY_MATRIX_IT_MV //UNITY_MATRIX_MV的逆转置矩阵,用于将发现从模型空间转换到观察空间,也可以用于得到UNITY_MATRIX_MV的逆矩阵
  14.  
  15. unity_ObjectToWorld(_Object2World) //当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间
  16.  
  17. unity_WorldToObject(_World2Object) //用于将顶点/方向矢量从世界空间转换到模型空间
  18. ---------------------
  19. 作者:honey199396
  20. 来源:CSDN
  21. 原文:https://blog.csdn.net/honey199396/article/details/54574254
  22. 版权声明:本文为博主原创文章,转载请附上博文链接!

6 Unity Shader 摄像机和屏幕参数

  1. //该摄像机在世界空间中的位置
  2. float3 _WorldSpaceCameraPos
  3.  
  4. //x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near,z=Far,w=1.0+1.0/Far,其中Near和Far分别是近裁剪平面和远裁剪平面到摄像机的距离
  5. float4 _ProjectionParams
  6.  
  7. //x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height,其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度
  8. float4 _ScreenParams
  9.  
  10. //x=1-Far/Near,y=Far/Near,z=x/Far,w=y/Far,该变量用于线性化Z缓存中的深度值
  11. float4 _ZBufferParams
  12.  
  13. //x=width,y=height,z没有定义,w=1.0(该摄像机是正交摄像机)或w=0.0(该摄像机是透视摄像机),其中width和height是正交投影摄像机的宽度和高度
  14. float4 unity_OrthoParams
  15.  
  16. //该摄像机的投影矩阵
  17. float4x4 unity_CameraProjection
  18.  
  19. //该摄像机的投影矩阵的逆矩阵
  20. float4x4 unity_CameraInvProjection
  21.  
  22. //该摄像机的6个裁剪平面在世界空间下的等式,按左、右、下、上、近、远裁剪平面
  23. float4 unity_CameraWorldClipPlanes[]
  24. ---------------------
  25. 作者:honey199396
  26. 来源:CSDN
  27. 原文:https://blog.csdn.net/honey199396/article/details/54574254
  28. 版权声明:本文为博主原创文章,转载请附上博文链接!

[Unity Shader] 常用的数值类型和语义的更多相关文章

  1. [Unity] Shader(着色器)输入输出和语义

    在Unity5.x后, 已经支持了基于物理的光照模型,也就是常说的次时代引擎所必须具备的功能. 如果在Properties使用2D,CG里要用sampler2D,代表使用的是2维纹理 如果在Prope ...

  2. Unity Shader常用函数,标签,指令,宏总结(持续更新)

    极端常用: UnityObjectToClipPos(v.vertex); 最基本的顶点变换,模型空间 ==>裁剪空间 mul(unity_ObjectToWorld, v.vertex); 顶 ...

  3. unity shader 常用函数列表

    此篇博客转自csdn的一位大牛. 中间排版出了一些问题 Intrinsic Functions (DirectX HLSL) The following table lists the intrins ...

  4. Unity Shader中自定义枚举类型

    效果 脚本: Properties { _MainTex ("Texture", 2D) = "white" {} [Enum(Enum1,,Enum2,)]_ ...

  5. 021-PHP常用的数值类型判断函数

    <?php //判断数组 $colors = array("red", "blue", "green"); if(is_array($ ...

  6. Unity Shader入门精要学习笔记 - 第4章 学习 Shader 所需的数学基础

    摘录自 冯乐乐的<Unity Shader入门精要> 笛卡尔坐标系 1)二维笛卡尔坐标系 在游戏制作中,我们使用的数学绝大部分都是计算位置.距离.角度等变量.而这些计算大部分都是在笛卡尔坐 ...

  7. 第二章 Unity Shader基础

    [TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...

  8. Unity3D学习笔记3——Unity Shader的初步使用

    目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...

  9. Unity Shader基础

    Unity Shader基础 先上代码,代码一般是这样的. void Initialization(){ //先从硬盘加载代码再加载到GPU中 string vertexShaderCode = Lo ...

随机推荐

  1. VS2015 无法启动IIS Express Web服务器(已解决)

    VS2015 无法启动IIS Express Web服务器 首先说一下我遇到问题的情况.这个项目是在公司电脑创建的,运行一直是正常的.今天把项目拷贝回来做. 可是到自己的电脑上,运行就提示 无法启动I ...

  2. 如何处理高并发情况下的DB插入

    1.  我们需要接收一个外部的订单,而这个订单号是不允许重复的 2.  数据库对外部订单号没有做唯一性约束 3.  外部经常插入相同的订单,对于已经存在的订单则拒绝处理 对于这个需求,很简单我们会用下 ...

  3. 【原创】uWSGI http和http-socket说明

    http 和 http-socket的使用上有一些区别: http: 自己会产生一个http进程(可以认为与nginx同一层)负责路由http请求给worker, http进程和worker之间使用的 ...

  4. 3631. [JLOI2014]松鼠的新家【树形DP】

    Description 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在“树”上.松鼠想邀 ...

  5. Hadoop学习之路(十三)MapReduce的初识

    MapReduce是什么 首先让我们来重温一下 hadoop 的四大组件: HDFS:分布式存储系统 MapReduce:分布式计算系统 YARN:hadoop 的资源调度系统 Common:以上三大 ...

  6. 20145203盖泽双 《Java程序设计》第十周学习总结

    20145203盖泽双 <Java程序设计>第十周学习总结 教材学习内容总结 一.网络概述 1.网络编程就是两个或多个设备(程序)之间的数据交换. 2.识别网络上的每个设备:①IP地址②域 ...

  7. c++ 多态,虚函数、重载函数、模版函数

    c++三大特性:封装.继承.多态.封装使代码模块化,继承扩展已存在的代码,多态的目的是为了接口重用 虚函数实现:虚函数表:指针放到虚函数表 多态:同名函数对应到不同的实现 构造父类指针指向子类的对象 ...

  8. nagios 在nrpe中自定义脚本

    监控第三方端口(22000) #!/bin/bash#author:xiaoweige#check 140 22000 result=`sleep 1|telnet 10.2.1.140 22000| ...

  9. ios宏定义学习

    宏简介: 宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串).这种替换在预编译时进行,称作 ...

  10. mac上ssh工具,包含简易的文件传输功能

    最近需要在mac上连ssh,但是之前在mac上用的都是简易的SSH Shell,没有找到传输文件的功能. 这时候就非常想念win上的winscp,有个界面,传点东西还是很直观的. 几经搜寻,终于找到一 ...