(五·一)计算机图形学 之 Unity Shader的CG基本语法

基本类型表达式

1:语法和C语言类是,有对应的编译器,程序是给显卡运行;
2:可以从渲染流水线中获得对应的输入;
3:指定的输出能流入下一个流水线模块;
4:操作符号和C语言一样,可以使用+,-*/<,>,<=,二=等运算;
5:Cg提供了float half double 浮点类型;
        float 单精度浮点
        half 半精度浮点
        double双精度浮点
7:Cg支持定点数fixed来高效处理某些小数;
8:Cg使用int来表示整数;
9:bool 数据类型来表示逻辑类型;
10:sampler*,纹理对象的句柄,sampler/1D/2D/3D/CUBE/RECT
11:内置向量数据类型:float4(float, float, float, float),向量长度不能超过4;
12内置矩阵数据类型:float1x1 float2x3 float4x3 float4x4;不能超过4x4;
13:数组类型float al10];10个float, float4 b110],10个float4;
14:语义鄉定 float4 a :POSITION,返回值也可以语义绑定;


结构体与语义

1: struct name {
        类型 名字;
        //尽量不要使用函数;
        返回值 函数名称(参数)(/ 如果成员函数里面使用,数据成员,该成员定义在函数体前;
        }

};

2:输入语义与输出语义:
语义:一个阶段处理数据,然后传输给卡一个阶段,那么每个阶段之间的接口,例如:顶点
处理器的输入数据是处于模型空间的顶点数据(位置、法向量),输出的是投影坐标和光
照颜色:片段处理器要将光照颜色做为输入;C/C++用指针,而Cg通过语义鄉定的形式;
输入语义:绑定接收参数,从上一个流水线获得参数;
输出语义:绑定输出参数到下一个流水线模块:
语义:入口西数上有意义(顶点着色入口,像素着色入口),普通的函数无意义;

常用语义:

 常用语义:
1.POSITION:  获取模型顶点的信息(位置)。
2.TANGENT:获取切线信息。
3.NORMAL: 获取法线信息。
4.TEXCOORD (n  也称UV): 高精度的 从 顶点传递信息 到 片段着色器。(float2 float3 float4)
        TEXCOORD0:第一套纹理
        TEXCOORD1:第二套纹理
        TEXCOORD2:第三套纹理
5.COLOR: 颜色,低精度 从顶点传递信息 到 片段着色器。(float4)
6.SV_POSITION: 表示 已经经过 mvp 矩阵 转换到 屏幕坐标的位置。
7.SV_TARGET:  输出到 哪个 render target、

标准内置函数

1:abs(num)绝对值;
2.三角函数;
3:cross(a,b) 两个向量的叉积;
4: determinant(M)矩阵的行列式
5:dot(a,b)两个向量的点积:
6:floor(x)向下取整;
7:lerp(a,b,f),在a,b之间线性插值;
8:log2(×) 基于2为底的x的对数;
9:mul(m, n):矩阵x矩阵,矩阵x向量,向量x矩阵;
10:power(x,y)x的y次方;
11: radians(×) 度转弧度;
12:reflect(v, n)v关于法线n的反射向量;
13:round(x) 靠近取整;
14:tex2D(smapler, x)二维纹理查找(x是在纹理上的坐标)
15: tex3Dproj(smapler, x) 投影三维纹理查找
16:texCUBE 立方体贴图纹理查找;

17:distance()计算点的距离;

Unity自带函数

1:引用Unity自带的函数库: #inelide "UnityCG.ceinc• Unity --> Edit --> Data --> CGlncludes:
2:TRANSFORM TEX:根据顶点的纹理坐标,计算出对应的纹理的真正的UV坐标;
3:使用属性的变量:在shader里面需要使用属性变量还需要在shader中定义一下这个变量的类型;
名字要保持一致:
4:外部修改shader的编辑器上的参数值;

代码示例:

Shader "GFSudy/Myshader1"
{
    //属性 可以在编辑器中查看和修改
    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
    {
		Pass{
			CGPROGRAM  // 插入Cg代码的开始

			//定义一个结构体
			struct my_struct{
				int a;
			}; //结尾一定要有分号

			//定义一个函数
			float sum(float a,float b)
			{
				return a + b;
			}


			fixed4 _Color;  //首先定义同样名字的变量 才可以访问到
			sampler2D _MainTex;

			#pragma vertex my_vert // 把my_vert作为顶点Shader的入口
			// 如何获取上一个模块的参数呢?: 语义绑定bind  输入输出
			float4 my_vert(float4 pos : POSITION) : POSITION
			{
				return UnityObjectToClipPos(pos);
			}

			#pragma fragment my_frag // 把my_frag作为片元Shader的入口
			fixed4 my_frag():COLOR
			{
				//return fixed4(1.0,0.0,0.0,1.0);  //这里直接把颜色设置为了红色
				return _Color;  //这里使用属性里的颜色
			}

			/*fixed4 my_frag(float2 uv:TEXCOORD0):COLOR
			{
				//return fixed4(1.0,0.0,0.0,1.0);  //这里直接把颜色设置为了红色
				//return _Color;  //这里使用属性里的颜色
				return tex2D(_MainTex,uv);  //这里使用贴图上的对应uv(也就是2d坐标位置)的纹理
			}*/

			ENDCG	// 插入Cg代码的结束
		}
    }
    FallBack "Diffuse"
}

猜你喜欢

转载自blog.csdn.net/u013774978/article/details/130050212