Shader,想说爱你不容易。

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013120715/article/details/52010662

这两天开始接触shader,给我的第一感觉是容易,第二感觉是难,第三赶脚是数学不好就先学数学吧

首先我们通过unity自己创建一个shader脚本的时候,其实shader已经给我们搭建好了编写shader基本的框架,我们要做的就是往里面写自己的shader,但是写之前总的先认识这里面有啥子东西吧。先创建一个shader瞅瞅,我使用的unity的版本为5.x,代码如下:

Shader "Custom/BasicDiffuse" {
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows


		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0


		sampler2D _MainTex;


		struct Input {
			float2 uv_MainTex;
		};


		half _Glossiness;
		half _Metallic;
		fixed4 _Color;


		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		ENDCG
	} 
	FallBack "Diffuse"
}

unity4.x创建的shader代码如下:

Shader "Custom/BasicDiffuse" {  
    Properties {  
        _MainTex ("Base (RGB)", 2D) = "white" {}  
    }  
    SubShader {  
        Tags { "RenderType"="Opaque" }  
        LOD 200  
          
        CGPROGRAM  
        #pragma surface surf Lambert  
  
        sampler2D _MainTex;  
  
        struct Input {  
            float2 uv_MainTex;  
        };  
  
        void surf (Input IN, inout SurfaceOutput o) {  
            half4 c = tex2D (_MainTex, IN.uv_MainTex);  
            o.Albedo = c.rgb;  
            o.Alpha = c.a;  
        }  
        ENDCG  
    }   
    FallBack "Diffuse"  
}  
unity4.x 和5.x是有区别的,我们以5.x为准。

其实shader生成的东西主要由三部分组成:Properties,Subshader和FallBack。

Properties的组成结构为{VariableName(Inspecto Variable Name, Type) = Value},请看Type的类型Type而该结构中最重要的莫过于VariableName,这个变量的名称在我们之后写shader的过程中要用到,类似于c++中的变量。

subShader则是我们用来渲染对象的主要内容,对于新手什么Tags,LOD可以暂时自己了解,不必深究。而#pragma surface surf Standard fullforwardshadows这句话则相当的重要,它将直接告诉Shader使用哪个光照模型用于计算,这个名叫 Standard fullforwardshadows则是unity默认的光照模型,现在我们自己创建了一个BasicDiffuse的脚本那就将名字替换为BasicDiffuse。_MainTex是与贴图相关,我们可以在unity界面的Inspector中拖入一张图片让如其中就相当于给_MainTex赋值了,也就是Input已经有值了。surf既然有输入的Input的值,在这里那就有输出的值了,不然怎么知道渲染的结果是什么呀,而SurfaceOutputStandard正是扮演者输出值得角色。

FallBack和SurfaceOutputStandard的值将会在后面的内容中讲到



广告之后再回来!

展开阅读全文

没有更多推荐了,返回首页