欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UnityShader自学笔记(一)

程序员文章站 2022-07-02 08:08:01
...

Shader自学笔记

定义

UnityShader != Shader
是对Shader得一种高度封装,可通过简单指令对开启混合、深度测试等进行设置。
不需要编写冗长代码设置着色器输入输出、考虑输入输出位置与对应关系
但对Shader类型和语法都有限制

语法格式

顶点/片元着色器

   shader“名字”
   SubShader
   {
    Pass{
        CGPROGRAM
             #pragma vertex      名字a  //顶点着色器函数名字 
             #pragma fragment 名字b  //片段着色器的名字

             float4 名字a (float4 v:POSITION) : SV_POSITION {
          		return mul (UNITY_MATRIX_MVP, v); 
    		}
   
    		fixed4 名字b() : SV_Target { //返回一个红色的颜色值 return     fixed4(1.0,0.0,0.0,1.0); 
    		}
    	ENDCG
   }

这部分我自己查的,拓展了解:

SV_POSITION 属于语义绑定 与POSITION 用法无异
SV_前缀 代表 system value
区别: SV_POSTION被作为vertex shader的输出语义时,最终的顶点位置便被固定了,直接进入光栅化处理。如果作为fragment shader的输入语义那么和POSITION是一样的,代表着每个像素点在屏幕上的位置。

表面着色器

Unity创造的一种着色器,代码量小,渲染代价大)
表面着色器是Unity对顶点/片元着色器的更高一层抽象

   shader“名字”
   //预设属性
   Properties {
   
   }
   
   SubShader
   {
  		//标记键值对,用于确认渲染顺序和子渲染器的其他参数
      	Tags{"RenderType" = "Opaque"}
      	CGPROGRAM
    		//光照模式声明:使用兰伯特光照模式 
           	#pragma surface surf Lambert
            //输入结构
    		struct Input 
    		{
        	//四元素的颜色值(RGBA)
        	float4 color : COLOR;
    		};
    		//表面着色函数的编写
    		//函数名可以随便定义
        	void surf (Input IN, inout SurfaceOutput o) 
    		{
        		//反射率
 				o.Albedo = float3(0.5,0.8,0.3);//(0.5,0.8,0.3)分别对应于RGB分量
 				//而o.Albedo = 0.6;等效于写o.Albedo = float3(0.6,0.6,0.6);
   			 }
 		ENDCG
   }       
   Fallback "Diffuse"

拓展

所有shaders都拥有一个渲染类型标签,比如 “Opaque”, “Transparent”, “Background”, “Overlay”,你就可以编写一个含有”RenderType = Solid”的替换着色器来只渲染固体物体。其他标记并不会在该替换着色器中被找到,所以与其对应的物体将不会被渲染。或者,你可以编写拥有不同的”RenderType”标签值的子着色器。所有Unity内置着色器都含有一个”RenderType”标签集。

在Unity内置着色器的shader替换标签

Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器terrain additive pass shaders)。
TransparentCutout: 蒙皮透明着色器masked transparency shaders (Transparent Cutout,两个通道的植被着色器)。
Background: Skybox shaders.
Overlay: GUITexture,光晕,闪光着色器。
TreeOpaque: 地形引擎中的树皮。
TreeTransparentCutout: terrain engine tree leaves.
TreeBillboard: terrain engine billboarded trees. Grass: terrain
GrassBillboard: terrain engine billboarded grass.

固定着色器

现在GPU都支持渲染管线了,固定着色器深追下去没太大意义

相关标签: Unity UnityShader