Unity Shader基础(2)--shader的结构解析
来源:互联网 发布:拍照软件知乎 编辑:程序博客网 时间:2024/04/30 01:36
摘自冯乐乐的《unity shader 入门精要》
由于之前看《Unity shader 入门精要》看到太过粗略了,只关注书中的shader代码,导致好多代码都是不是很懂,所以就往回看,
找找对于shader的一些基础知识
还是先直接上代码,注释有较为详细的一些解释,部分注释代码是由于看的内容比较多,然后就懒的分几篇博客来写了了:
1,一个简单的着色器(SimpleShader)
Shader "Custom/SimpleShader" {SubShader{Pass{CGPROGRAM//包含顶点着色器代码和包含片元着色器的代码的编译指令#pragma vertex vert#pragma fragment frag//vert函数的输入v包含了这个顶点的位置,它是通过POSITION语义定义的//并返回一个float4类型的变量,它是该顶点在剪裁空间中的位置,//POSITION和SV_POSITION都是CG/HLSL的语义,它们不可省略,//这些语义告诉用户需要哪些输入值,以及输出的是什么//在这里POSITION告诉unity把模型顶点坐标填充到参数v中,//SV_POSITION告诉unity顶点着色器输出的是裁剪空间的坐标float4 vert(float4 v : POSITION) : SV_POSITION{//使用v.vertex来访问模型空间的顶点坐标return mul (UNITY_MATRIX_MVP,v);}//在这里,frag没有任何输入,它输出了一个fixed4的类型变量,并使用了SV_Target//进行限定fixed4 frag() : SV_Target{return fixed4 (1.0, 1.0, 1.0, 1.0);}fixed4 frag(v2f i) : SV_Target{//将插值后的i.color显示到屏幕上return fixed4(i.color, 1.0);}ENDCG}}FallBack "Diffuse"}
我们必须使用如下指令来声明结构体
struct StructName{ Type Name : Semantic; Type Name : Semantic;
<span style="white-space:pre"></span>......}
Shader "Custom/SimplerShader" {SubShader{Pass{CGPROGRAM//包含顶点着色器代码和包含片元着色器的代码的编译指令#pragma vertex vert#pragma fragment fragstruct a2v{//POSITION告诉unity,用模型空间的顶点坐标填充vertex变量float4 vertex : POSITION;//NORMAL告诉unity,用模型空间的法线方向填充normal变量float3 normal : NORMAL;//TEXCOORD0告诉unity,用模型的第一套纹理坐标填充texcrood变量float4 texcoord : TEXCOORD0;};float4 vertex(a2v v) : SV_POSITION{//使用v.vertex来访问模型空间的顶点坐标return mul(UNITY_MATRIX_MVP, v.vertex);}fixed4 frag() :SV_Target{return fixed4(1.0, 1.0, 1.0,1.0);}ENDCG}}}
unity支持的语义有:POSITION,TANGENT,NORMAL,TEXCOORD0,TEXCOORD1,TEXCOORD2,TEXCOORD3,COLOR等
3.顶点着色器与片元着色器之间的通信
Shader "Custom/SimpleShader" {SubShader{Pass{CGPROGRAM//包含顶点着色器代码和包含片元着色器的代码的编译指令#pragma vertex vert#pragma fragment frag//在CG代码中,我们需要定义一个与属性名称和类型都匹配的变量fixed4 _Color;struct a2v{//POSITION告诉unity,用模型空间的顶点坐标填充vertex变量float4 vertex : POSITION;//NORMAL告诉unity,用模型空间的法线方向填充normal变量float3 normal : NORMAL;//TEXCOORD0告诉unity,用模型的第一套纹理坐标填充texcrood变量float4 texcoord : TEXCOORD0;};struct v2f {//SV_POSITION告诉unity,pos包含了顶点在剪裁空间中的位置信息float4 pos : SV_POSITION;//COLOR语义可以用于存储颜色信息fixed3 color : COLOR0;};v2f vert(a2v v) : SV_POSITION{//声明输出结构v2f o;o.pos = mul (UNITY_MATRIX_MVP,v.vertex);//v.normal包含了顶点的法线方向,其分量范围在[-1.0, 1.0]//下面的代码把分量范围映射到[0.0, 1.0]//存储到o.color中传递给片元着色器o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);return o;}fixed4 frag(v2f i) : SV_Target{//将插值后的i.color显示到屏幕上return fixed4(i.color, 1.0);}ENDCG}}FallBack "Diffuse"}
4,使用属性
Shader "Custom/SimpleShader" {Properties{//声明一个Color类型的属性_Color ("Color Tint", Color) = (1, 1, 1, 1)}SubShader{Pass{CGPROGRAM//包含顶点着色器代码和包含片元着色器的代码的编译指令#pragma vertex vert#pragma fragment frag//在CG代码中,我们需要定义一个与属性名称和类型都匹配的变量fixed4 _Color;struct a2v{//POSITION告诉unity,用模型空间的顶点坐标填充vertex变量float4 vertex : POSITION;//NORMAL告诉unity,用模型空间的法线方向填充normal变量float3 normal : NORMAL;//TEXCOORD0告诉unity,用模型的第一套纹理坐标填充texcrood变量float4 texcoord : TEXCOORD0;};struct v2f {//SV_POSITION告诉unity,pos包含了顶点在剪裁空间中的位置信息float4 pos : SV_POSITION;//COLOR语义可以用于存储颜色信息fixed3 color : COLOR0;};v2f vert(a2v v) : SV_POSITION{//声明输出结构v2f o;o.pos = mul (UNITY_MATRIX_MVP,v.vertex);//v.normal包含了顶点的法线方向,其分量范围在[-1.0, 1.0]//下面的代码把分量范围映射到[0.0, 1.0]//存储到o.color中传递给片元着色器o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);return o;}fixed4 frag (v2f i) : SV_Target{fixed3 c = i.color;//使用_Color属性来控制输出的颜色c *= _Color.rgb;return fixed4(c, 1.0);}ENDCG}}FallBack "Diffuse"}
最后给出一些ShaderLab属性类型与CG变量类型的匹配关系
0 0
- Unity Shader基础(2)--shader的结构解析
- Unity Shader学习笔记(一) shader的基础结构
- unity3d shader学习(2)-unity shader的结构
- Shader学习笔记(一)认识Unity Shader,Unity Shader的基本结构
- 【Unity Shader实战】卡通风格的Shader(二)(2)
- Unity Shader基础(1)
- Unity Shader基础(3)--unity shader 常用语义
- Unity Shader入门精要笔记(二):Unity Shader基础
- 【Unity Shader入门精要】Shader所需的数学基础
- 【Unity Shader】基础光照
- Unity Shader基础
- 【Unity Shader】UnityShader基础
- unity shader:数学基础
- Unity Shader入门基础
- 【Unity】Surface Shader的Input输入结构
- Unity Shader文件的 一般结构
- Unity Shader 的组织结构形式
- Unity Shader 基础2---编程基础
- Unity3D——利用单例创建并永久化游戏对象(单例模式的应用)
- 深入理解与应用Hadoop中的MapReduce
- JQuery 开始关闭按钮禁用属性
- 一位IT牛人的十年经验之谈
- C#基础之LINQ语法解析
- Unity Shader基础(2)--shader的结构解析
- JNI 字符串处理乱码问题jstring to char
- RabbitMQ学习笔记
- 为什么说深度学习是金融创新的新引擎
- ubuntu android studio 不能输入中文
- 可变参数 :(NSString *)code,...
- Spark中实现TOP N (Java版本)
- HDU 3313 Key Vertex (网络流)
- 奋斗的黄金时代:马化腾在清华的访谈,可以给青年哪些启示?