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

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. CSS 构造表格

    表格边框 CSS 中设置表格边框,请使用 border 属性: <style type="text/css"> table{ border:1px solid red; ...

  2. Centos7配置samba

    Centos7配置samba 1.安装 yum install samba samba-client samba-common -y 2.配置 备份已有配置mv /etc/samba/smb.conf ...

  3. chrome://命令

    一些常用的命令: chrome://version 显示当前版本 chrome://flags 实验项目,加“#项目名称”锚点可以直接定位到项目 chrome://settings 设置,下图是设置定 ...

  4. springboot项目打war包pom设置

    <build> <finalName>PayManager</finalName><!--打包后的名字PayManager.war--> <plu ...

  5. CommonJS、AMD、CMD、NodeJs、RequireJS到底有什么联系?

    JS中的模块规范(CommonJS,AMD,CMD),如果你听过js模块化这个东西,那么你就应该听过或CommonJS或AMD甚至是CMD这些规范,本文包括这三个规范的来源及对应的产物的原理. 一.C ...

  6. P2904 [USACO08MAR]跨河River Crossing

    题目描述 Farmer John is herding his N cows (1 <= N <= 2,500) across the expanses of his farm when ...

  7. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  8. DL4NLP —— 序列标注:BiLSTM-CRF模型做基于字的中文命名实体识别

    三个月之前 NLP 课程结课,我们做的是命名实体识别的实验.在MSRA的简体中文NER语料(我是从这里下载的,非官方出品,可能不是SIGHAN 2006 Bakeoff-3评测所使用的原版语料)上训练 ...

  9. iview的Affix插件遇到滚动时候的bug处理方法

    最近有个需求,是用vue做的页面,其中嵌入了一个tinymce编辑器,编辑器设置了自动调整高度,也就是说编辑器中内容越多,高度就会自动撑高 我们需要再页面最下方放一个保存按钮,保存按钮必须固定在屏幕下 ...

  10. Scala-字符串操作

    package com.bigdata object StringO { def main(args: Array[String]): Unit = { val s1 = "Hello&qu ...