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

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

Color、Vector:float4,half4,fixed4

Range、Float:float, half, fixed

2D:sampler2D

3D:sampler3D

Cube:samplerCube

Int:int(32位整型数据)

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

 Shader "Unlit/Test Shader"
{
Properties
{
_Color ("Color Tint", Color) = (, , , )
_MainTex ("Main Tex", 2D) = "white" {}
_BumpMap ("Normal Map", 2D) = "bump" {}
_BumpScale ("Bump Scale", Float) = 1.0
_SpecularMask ("Specular Mask", 2D) = "white" {}
_SpecularScale ("Specular Scale", Float) = 1.0
_Specular ("Specular", Color) = (, , , )
_Gloss ("Gloss", Range (8.0, 256.0)) = 20.0
}
SubShader{
Pass{
......
}
}

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

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

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

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

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

             fixed4 _Color;
sampler2D _MainTex;
float4 _MainTex_ST;
sampler2D _BumpMap;
float _BumpScale;
sampler2D _SpecularMask;
float _SpecularScale;
fixed4 _Specular;
float _Gloss; struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 tangent : TANGENT;
float4 texcoord : TEXCOORD0;
}; struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float3 lightDir : TEXCOORD1;
float3 viewDir : TEXCOORD2;
}; v2f vert (a2v v)
{
v2f o;
......
return o;
} fixed4 frag (v2f i) : SV_Target
{
......
return fixed4(ambient + diffuse + specular, 1.0);
}

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常用函数

  

float3 WorldSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回世界空间中从该点到摄像机的观察方向

float3 ObjSpaceViewDir(float4 v) //输入一个模型空间中的顶点位置,返回模型空间中从该点到摄像机的观察方向

float3 WorldSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回世界空间中从该点到光源的光照方向,没有被归一化

float3 UnityWorldSpaceLightDir(float4 v) //仅可用于前向渲染中,输入一个世界空间的顶点位置,返回世界空间从该点到光源的光照方向,没有被归一化

float3 ObjSpaceLightDir(float4 v) //仅用于前向渲染中(ForwardBase),输入一个模型空间中的顶点位置,返回模型空间中从该点到光源的光照方向,没有被归一化

float3 UnityObjectToWorldNormal(float3 norm) //把法线从模型空间转换到世界空间中

float3 UnityObjectToWorldDir(in float3 dir) //把方向矢量从模型空间转换到世界空间中

float3 UnityWorldToObjectDir(float3 dir) //把方向矢量从世界空间转换到模型空间中

float3 Shade4PointLights(...) //仅可用于前向渲染中,计算四个点光源的光照,它的参数是已经打包进矢量的光照数据。前向渲染通常会使用这个函数来计算逐顶点光照
---------------------
作者:honey199396
来源:CSDN
原文:https://blog.csdn.net/honey199396/article/details/54574254
版权声明:本文为博主原创文章,转载请附上博文链接!

5 Unity Shader 变量

UNITY_MATRIX_MVP    //当前的模型*观察*投影矩阵,用于将顶点/方向矢量从模型空间转换到裁剪空间

UNITY_MATRIX_MV //当前的模型*观察矩阵,用于将顶点/方向矢量从模型空间转换到观察空间

UNITY_MATRIX_V  //当前的观察矩阵,用于将顶点/方向矢量从世界空间转换到观察空间

UNITY_MATRIX_P  //当前的投影矩阵,用于将顶点/方向矢量从观察空间转换到裁剪空间

UNITY_MATRIX_VP //当前的观察*投影矩阵,用于将顶点/方向矢量从世界空间转换到裁剪空间

UNITY_MATRIX_T_MV   //UNITY_MATRIX_MV的转置矩阵

UNITY_MATRIX_IT_MV  //UNITY_MATRIX_MV的逆转置矩阵,用于将发现从模型空间转换到观察空间,也可以用于得到UNITY_MATRIX_MV的逆矩阵

unity_ObjectToWorld(_Object2World)  //当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间

unity_WorldToObject(_World2Object)  //用于将顶点/方向矢量从世界空间转换到模型空间
---------------------
作者:honey199396
来源:CSDN
原文:https://blog.csdn.net/honey199396/article/details/54574254
版权声明:本文为博主原创文章,转载请附上博文链接!

6 Unity Shader 摄像机和屏幕参数

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

[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. log4j.properties的配置详解

    log4j.rootLogger=ERROR,A1log4j.appender.A1=org.apache.log4j.ConsoleAppenderlog4j.appender.A1.layout= ...

  2. 给 Virtualbox 中 Ubuntu 系统设置静态 IP

    虚拟机网络选择 桥接网卡 模式. 主要涉及两个步骤: 1. 修改 /etc/network/interfaces 文件: 2. 修改 dns : 第一步,修改 interfaces 文件: sudo ...

  3. 10、Android--技巧

    10.1.全局获取Context的技巧 在实践中有很多的地方都可以使用到Context 弹出Toast的时候需要,启动活动的时候需要.发送广播的时候需要. 操作数据库的时候需要.使用通知的时候需要.. ...

  4. Lambda表达式学习(1)

    项目里面需要经常对一系列同类型集合进行操作 ,  如对集合进行增加元素 ,  删除集合的指定索引的元素等等.我们可以使用ArrayList来进行. 如 ArrayList stringArrayLis ...

  5. 跳转到appstore下载app的链接 记录一下

    这是链接: https://itunes.apple.com/cn/app/da-dou-dou-lao-shi/id1395835036?mt=8 其中值得一提的是mt参数是啥意思 见下图:

  6. iOS裁剪,缩放图片白边问题解决办法

    几年没来了,感觉还是要写点啥,以后碰见问题 解决就写这吧,当是一个随时的笔记也好. iOS裁剪,缩放图片的代码网上也很多了,但是笔者出现了右边和下边出现白边的情况.出现白边的原因是给的size中的CG ...

  7. python3爬虫-使用requests爬取起点小说

    import requests from lxml import etree from urllib import parse import os, time def get_page_html(ur ...

  8. #leetcode刷题之路18-四数之和

    给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满 ...

  9. scribe日志系统安装笔记

    版本历史 2011-02-12 17:36:57 完成文章2011-02-23 10:49:12 更新,修正部分文字 目前web访问日志为crontab定时清空,而且负载均衡后,访问随机分配到一台服务 ...

  10. 2017-2018-2 20155315《网络对抗技术》Exp1:PC平台逆向破解

    实验目的 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. 该程序同时包含另一个代码片段,getShe ...