Shader_0

属性

在Properties{}中定义着色器属性,在这里定义的属性将被作为输入提供给所有的子着色器:

_Name("Display Name", type) = defaultValue[{options}]

  • _Name - 属性的名字,简单说就是变量名,在之后整个Shader代码中将使用这个名字来获取该属性的内容
  • Display Name - 这个字符串将显示在unity的材质编辑器中作为Shader的使用者可读的内容
  • type - 这个属性的类型,可能的type所表示的内容有以下几种:
    • Color - 一种颜色,由RGBA(红绿蓝和透明度)四个量来定义;
    • 2D - 一张2的阶数大小(256,512之类)的贴图。这张贴图将在采样后被转为对应基于模型UV的每个像素的颜色,最终被显示出来;
    • Rect - 一个非2阶数大小的贴图;
    • Cube - 即Cube map texture(立方体纹理),简单说就是6张有联系的2D贴图的组合,主要用来做反射效果(比如天空盒和动态反射),也会被转换为对应点的采样;
    • Range(min, max) - 一个介于最小值和最大值之间的浮点数,一般用来当作调整Shader某些特性的参数(比如透明度渲染的截止值可以是从0至1的值等);
    • Float - 任意一个浮点数;
    • Vector - 一个四维数;
  • defaultValue 定义了这个属性的默认值,通过输入一个符合格式的默认值来指定对应属性的初始值(某些效果可能需要某些特定的参数值来达到需要的效果,虽然这些值可以在之后在进行调整,但是如果默认就指定为想要的值的话就省去了一个个调整的时间,方便很多)。
    • Color - 以0~1定义的rgba颜色,比如(1,1,1,1);
    • 2D/Rect/Cube - 对于贴图来说,默认值可以为一个代表默认tint颜色的字符串,可以是空字符串或者”white”,”black”,”gray”,”bump”中的一个
    • Float,Range - 某个指定的浮点数
    • Vector - 一个4维数,写为 (x,y,z,w)
  • 另外还有一个{option},它只对2D,Rect或者Cube贴图有关,在写输入时我们最少要在贴图之后写一 对什么都不含的空白的{},当我们需要打开特定选项时可以把其写在这对花括号内。如果需要同时打开多个选项,可以使用空白分隔。可能的选择有 ObjectLinear, EyeLinear, SphereMap, CubeReflect,  CubeNormal中的一个,这些都是OpenGL中TexGen的模式。所以,一组属性的申明看起来也许会是这个样子的
//Define a color with a default value of semi-transparent blue
_MainColor ("Main Color", Color) = (0,0,1,0.5)
//Define a texture with a default of white
_Texture ("Texture", 2D) = "white" {}

接下来就是SubShader部分了。

!!!!!!!!!!!!!!!!!!!

到这里就开始看不懂了,开始补充知识-----------------

!!!!!!!!!!!!!!!!!!

介绍
TexGen全称是 Texture coordinate generation,即纹理坐标生成。本来模型的纹理坐标是在做模型的时候赋予各个顶点的。但是有时模型表面非常复杂,或者要做一些特效时,就需要其他方法来生成纹理坐标。
TexGen主要用于Fixed Function Shader.  有如下模式 ObjectLinear EyeLinear SphereMap CubeReflect CubeNormal . 
该函数直接对应 OpenGL的texgen modes。

所有这些模式也可以用Vertex&Fragment实现同样的效果。
一 ObjectLinear: 
coord = P1*X + P2*Y + P3*Z + P4*W
xyzw即物体的本地坐标,P1–P4 为系数
4组结果分别对应OpenGL里的 S, T, R, Q,即 coord.xyzw
而通常的纹理映射只用到s,t  也就是x y
以正方体为例,中心点(0,0,0) x=0 y=0,对应贴图的(0,0)点也就是贴图的左下角
而右上角的前点(0.5,0.5,0.5)后点(0.5,0.5,-0.5)均对应贴图的(0.5,0.5)点也就是贴图的中心点。以此类推得到右下图的结果。
 
 
 
 
  1. Shader "Texgen" {
  2.     Properties {
  3.         _MainTex ("Base", 2D) = "white" { TexGen ObjectLinear }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combine texture}
  8. }
  9. }
  10. }
 
 
  1. Shader "Custom/Texgen_Obj_FragMine" {
  2.    Properties {
  3.         _MainTex ("Base"2D"white" 
  4.     }
  5.     SubShader {
  6.         Pass {
  7.             CGPROGRAM
  8.             #pragma vertex vert
  9.             #pragma fragment frag
  10.             #include "UnityCG.cginc"
  11.             sampler2D _MainTex;
  12.             float4 _MainTex_ST;
  13.             struct v2f {
  14.                 float4  pos SV_POSITION;
  15.                 float2  uv TEXCOORD0;
  16.             } ;
  17.             v2f vert (appdata_base v)
  18.             {
  19.                 v2f o;
  20.                 o.pos mul(UNITY_MATRIX_MVP,v.vertex);
  21.                 o.uv v.vertex.xy;
  22.                 return o;
  23.             }
  24.             float4 frag (v2f iCOLOR
  25.             {
  26.                 float4 texCol tex2D(_MainTex,i.uv);
  27.                 return texCol;
  28.             }
  29.             ENDCG
  30.         }
  31.     }
  32. }
 
二 EyeLinear
与ObjectLinear类似,只是 xyzw即物体 在摄像机坐标系下的坐标
 
  1. Shader "Texgen" {
  2.     Properties {
  3.         _MainTex ("Base", 2D) = "white" { TexGen EyeLinear }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combinetexture }//尼玛这有空格好不
  8. }
  9. }
  10. }

  1. Shader "Custom/Eye" {
  2.    Properties {
  3.         _MainTex ("Base"2D"white" 
  4.     }
  5.     SubShader {
  6.         Pass {
  7.             CGPROGRAM
  8.             #pragma vertex vert
  9.             #pragma fragment frag
  10.             #include "UnityCG.cginc"
  11.             sampler2D _MainTex;
  12.             float4 _MainTex_ST;
  13.             struct v2f {
  14.                 float4  pos SV_POSITION;
  15.                 float2  uv TEXCOORD0;
  16.             } ;
  17.             v2f vert (appdata_base v)
  18.             {
  19.                 v2f o;
  20.                 o.pos mul(UNITY_MATRIX_MVP,v.vertex);
  21.                 o.uv =mul(UNITY_MATRIX_MV,v.vertex);
  22.                 return o;
  23.             }
  24.             float4 frag (v2f iCOLOR
  25.             {
  26.                 float4 texCol tex2D(_MainTex,i.uv);
  27.                 return outp;
  28.             }
  29.             ENDCG
  30.         }
  31.     }
  32. }

三 SphereMap
像镜子一样反射环境(此时这张纹理贴图相当于环境贴图)
 

  1. Shader "Texgen" {
  2.     Properties {
  3.   _Tex ("Cube", 2D) = "white" { TexGen SphereMap }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combinetexture }//坑爹的原博主居然把这里故意写错!!复制黏贴你就输了!!!
  8. }
  9. }
  10. }

四 CubeReflect
使用CubeMap(6面组成),像镜子一样反射环境(此时这张纹理贴图相当于环境贴图)
纹理坐标的xyz对应一条从Cubemap 中心射中的向量,穿过6面中某面的某点,该面该点周围的色素会被采样用以计算该碎片的最终颜色值。




 
 
  1. Shader "Texgen" {
  2.     Properties {
  3.    _Tex ("Cube", Cube) = "white" { TexGen CubeReflect }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combinetexture }//尼玛这也不对!!
  8. }
  9. }
  10. }

五 CubeNormal
使用CubeMap,显示天空盒,广泛使用的就不多说了。

!!!!!!!!!!!!!!

找了一篇文章,更看不懂了,继续------------OPENGL-ObjectLinear

!!!!!!!!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值