Unity Shader学习笔记(六) CG语言 一

CG语言 C for Graphics语言,C语言面向图形变成语言 前面几张笔记上有详细介绍

CG Profiles

https://developer.nvidia.com/cg-profiles 英伟达官网解释

https://www.jianshu.com/p/5a371dbc08a6 转自

数据类型

float - 32位元浮点数,一个符号位,(float2(1,1))

half - 16位元浮点数 

int - 32位元整数

fixed - 12位元定点数 (可以用于颜色值 fixed4(1,1,1,1))

bool - 真价值  true false (bool?a:b)

sampler* - 代表纹理对象(texture object)

关键词

in  输入

扫描二维码关注公众号,回复: 4297892 查看本文章

out 输出

inout 输入及输出 

例子

//CG代码开始
CGPROGRAM
#pragma vertex vert//顶点 计算函数
#pragma fragment frag //片段像素计算函数
// in 输入 表示模型带来的顶点数据
// float2 二阶的数据类型 (0.1,0.1)
//POSITION 语音表示这个 objPos是位置信息
//out 输出一个 四阶向量 输出给渲染使用
void vert(inout float4 pos : POSITION )
{
//	pos = float4(-1,-1,0,1);
	//col = fixed4(pos);

}
//inout 输入也输出的数据
//COLOR0 表示 颜色信息表示
void frag(out fixed4  col:COLOR0,in float4 pos:POSITION)
{
	half col_1 = 1;
	fixed4 col_4 = fixed4(col_1, col_1, col_1, col_1);
	col = col_4;// float4(pos);// float4(pos);
	//col = float4(0.5, 0, 0, 1);
}
ENDCG//CG代码结束

结构体

//获取模型带来的信息的结构体,
struct appdata
{
    float4 vertex : POSITION;//顶点位置信息
    float2 uv : TEXCOORD0;//UV信息
    float2 uv1 : TEXCOORD1;//UV2信息

}; 

swizzle操作

CG内的数据类型可以自定义向量类型,类似数组

float是一个浮点类型可以直接这样定义( half,fixed,bool 都支持)

float f2 = float2(1,1);

float3 f3 = float3(1,1,1);

float4 f4=float4(1,1,1,1);

swizzle是的操作是可以默认向量 4个值的字段值为 xyzw | rgba 也就是坐标系或者是颜值

float4 col=float4(f2,0,0);//f2直接可以后面数据拼凑成一个 float4的4阶向量

col=float4(f3.xyz,0)//f3.xyz 可以直接拼接成

col=float4(f3.rgb,0)//这样拼接也是可以的 


col=float4(f3.xyg,0)// 这样是不行的 不能混杂获取 

类型别名

typedef float4 FL4

FL4 fl4=FL4(1,1,1,1)

矩阵

float2x4 f2x4={1,1,1,1, 2,2,2,2}

float4 f4 = f2x4[0];

数组

不是swizzle 那样操作 只能用下标

float farr[4]={1,2,3,4}

流程语句

if
if(ture)
{

}
else if(true)
{

}
else
{

}

while
while(true)
{

}

do while
i=0;
do
{
    i++;
}
while(i<10);

for
for(i=0;i<10;i++)
{
}

注意所有循环次数最大次数是1023,不能大于这个值否则不能使用,也是为了显卡输出性能。

函数

1、CG语言是基于C语言开发的,流程性语言,所以必须先定义再使用否则编译报错

2,  所有参数都是值拷贝传参数,没有指针引用传参,可以使用out 参数类型来使用

例子1
 

void Func(out float4 col);//前项声明 
void Func(out float4 col)
{
    
}

例子2

float Func2(float arr[3])//函数参数数组长度 必须定义长度
{
    float sum=0;
    for(int i=0;i<arr.Length;i++)
    {
        sum+=arr[i];
    }
    return sum;

}

例子3 公共函数所有shader文件都可以使用

1 创建.cginc 文件,把方法写入到这个文件里

2 shader文件中导入这个文件#include "---/----.cginc" 下面就可使用了

#include "****.****.cginc"

上图是一个unity 自带的cube模型渲染出来的,利用 模型自带的UV信息

欢迎加入 互联网前端学习交流群  339033019

猜你喜欢

转载自blog.csdn.net/qq_18709863/article/details/84559938