• 【图形学】13 UnityShader语义(一)


    来源:《UNITY SHADER入门精要》

    1、UnityShader基本结构

    Shader "Unity Shaders"{
    	SubShader{
    		Pass{
    			CGPROGRAM
    			#pragma vertext vert
    			#pragma fragment frag
    			
    			float4 vert(float4 v : POSITION) : SV_POSITION{
    				return mul(UNITY_MATRIX_MVP, v);
    			}
    			
    			fixed4 frag() : SV_Target{
    				return fixed4(1.0, 1.0, 1.0, 1.0);
    			}
    			ENDCG
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

      ①第5、6行的#pragma vertext vert#pragma fragment frag这两条编译指令将告诉Unity,哪个函数包含了片元着色器的代码,哪个函数包含了顶点着色器的代码。
      ②第8、9行的函数:

    float4 vert(float4 v : POSITION) : SV_POSITION{
    	return mul(UNITY_MATRIX_MVP, v);
    }
    
    • 1
    • 2
    • 3

    首先,它返回的是一个 float4 类型的变量。POSITIONSV_POSITION 都是 CG/HLSL 中的 语义(semantics),这些语义讲告诉系统哪些是输入值,哪些是输出值。这里,POSITION 表达的是 把模型空间的顶点填充到输入参数 v 中, SV_POSITION 将告诉 Unity 顶点着色器的输出是裁剪空间中的顶点坐标。
      ③第12、13行的函数:

    fixed4 frag() : SV_Target{
    	return fixed4(1.0, 1.0, 1.0, 1.0);
    }
    
    • 1
    • 2
    • 3

    这个函数返回一个 fixed4 类型的值,返回的是 SV_Target 这也是 HLSL 中的一个系统语义,它告诉渲染器,把用户的输出颜色储存到一个渲染目标之中,这里将输出到磨人的帧缓存中。片元着色器中的代码很简单,返回的一个表示白色的 fixed4 类型的变量。片元着色器的输出的颜色的每个分量范围在 [0, 1]之间。(1,1,1)代表白色。

    2、ShaderLab中的结构体

     &emsp我们想要得到模型上每个顶点的坐标和法线向量。

    Shader "MyShader"{
    	SubShader{
    		Pass{
    			CGPROFRAM
    			
    			#pragma vertex vert
    			#pragma fragment frag
    			
    			struct a2v{
    				// POSITION 语义告诉Unity,用模型空间的顶点坐标填充vertex变量
    				float4 vertex : POSITION;
    				// NORMAL 语义告诉Unity,用模型空间的法线方向填充normal变量
    				float3 normal : NORMAL;
    				//TEXCOORD0 语义告诉Unity,用模型的第一套纹理坐标填充texcoord变量
    				float4 textcoord : TEXCOORD0;
    			};
    			
    			struct v2f{
    				float4 ppos : SV_POSITION;
    				fixed3 color : COLOR0;
    			}
    			
    			float4 vert(a2v v) : SV_POSITION{
    				return mul(UNITY_MATRIX_MVP, v.vertex);
    			}
    			
    			fixed4 frag() : SV_Target{
    				return fixed(1.0, 1.0, 1.0, 1.0);
    			}
    			
    			ENDCG
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

      上述代码的9-16行,我们定义一个新的结构体a2v,其中使用了更多的Unity支持的语义:NORMAL(法线)、TEXCOORD0(纹理坐标)。
      其中,我们命名结构体的名字 a2v 是什么含义呢?a代表 application,v代表vertex shader,a2v 代表把数据从 应用阶段 转到 顶点着色器。
      18-21行定义了 v2f ,其中,SV_POSITION 语义是最终裁剪空间的意思,而COLOR0 的语义规则可以由用户自行定义,用来存储颜色。

    3、Properties 属性

    Shader "MyShader"{
    	Proerties{
    		_Color ("颜色", Color) = (1.0, 1.0, 1.0, 1.0)
    	}
    	SubShader{
    		Pass{
    			CGPROGRAM
    			
    			#pragma vertex vert
    			#prama fragment frag
    			
    			fixed _Color;
    			float4 vert(){...}
    			float4 frag(){...}
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

      在上面的代码中,我们声明的是一个 Color 类型的变量,也赋予了它初始值。为了能够在CG代码中访问它,我们需要定一个变量,在12行,这个变量名称和类型必须和 Properties 语义块中的属性定义相匹配。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0OfPloqI-1659407792235)(assets/image-20220616164920110.png)]

    4、uniform关键字

      有时,我们可能会发现在CG变量前会有一个 uniform 关键字,例如:

    uniform fixed4 _Color;
    
    • 1

      uniform关键词是CG中修饰变量和参数的一种修饰词,它仅仅用于提供一些关于该变量的初始值是如何指定和存储的相关信息(这和其他一些图像编程接口中的uniform关键词的作用不太一样)。在Unity Shader中,uniform关键词是可以省略的。

  • 相关阅读:
    Python 和 Ruby 谁是最好的Web开发语言?
    规则引擎Drools在贷后催收业务中的应用
    阿里3年女软件测试工程师心声,当下最好的消息,莫过于我拿到了25K的offer
    每日复盘-202406017
    SQL基础理论篇(八):视图
    大数据开发之词频统计传参打包成jar包发送到Hadoop运行并创建可执行文件方便运行
    计算机网络 第四章:网络层
    自己实现 SpringMVC 底层机制 系列之-实现任务阶段 8- 完成返回 JSON 格式数据-@ResponseBody
    超强预测算法:XGBoost预测模型
    LeetcodeTop100 (30) 随机链表复制
  • 原文地址:https://blog.csdn.net/qq_40891541/article/details/126117445