梦见别人给钱是什么意思| 太监是什么| 什么的雨| 桃子不能和什么食物一起吃| 嗜睡是什么病的前兆| 百草霜是什么| 肺部硬结灶是什么意思| 喝酒拉肚子是什么原因| 7号来的月经什么时候是排卵期| 科颜氏属于什么档次| 火召是什么字| 供血不足吃什么药好| 吃生姜对身体有什么好处和坏处| 颈椎退行性病变是什么意思| 腋下检查挂什么科| ryan是什么意思| 炼乳是什么做的| 铺天盖地的意思是什么| 心脏难受是什么原因| 什么工作挣钱多| 失眠是什么| 铁剂是什么| 男性早泄吃什么药| jm是什么| 竞争是什么意思| 出什么什么什么| 男人右眼跳是什么预兆| utc是什么| 2000年属什么生肖| 地中海是什么意思| 农历正月初一是什么节| 左眼跳什么| 久之的之是什么意思| 心脏属于什么组织| 庞统和诸葛亮什么关系| 美人坯子是什么意思| 什么人不适合做厨师| 靥什么意思| 变形虫是什么生物| 什么鱼最大| 什么原因导致子宫内膜息肉| 风湿关节炎吃什么药| 尿酸高是什么引起的| 黑枸杞和红枸杞有什么区别| 小水滴会变成什么| 父亲节送什么礼物比较好| 98年属什么的| 白带多是什么情况| 避重就轻是什么意思| 为什么人会打喷嚏| 睡觉做噩梦是什么原因| 西红柿吃多了有什么坏处| 舌苔厚白腻是什么原因引起的| 为什么身上痒一抓就起疙瘩| 中暑发烧吃什么药| 长脸型适合什么样的发型女| 断袖是什么意思| 儿菜是什么菜| 嬴稷和嬴政什么关系| qt是什么| 一个山一个鬼念什么| 小孩小便红色是什么原因| 靶向药是什么药| 什么图强| 什么是遗憾| 友尽是什么意思| 脾虚是什么意思| 吃什么养发| 囊肿吃什么药| 牙龈发炎用什么药| 墨鱼是什么鱼| 子宫内膜厚什么原因引起的| 胃胀气用什么药最好| 拉分是什么意思| 逆来顺受什么意思| 两对半是什么意思| 欢五行属什么| 虎父无犬子什么意思| 意面是什么面| 鳗鱼吃什么食物| 空鼻症是什么| 感染性发热是什么意思| 肾积水挂什么科| 登革热是什么病| 孕期便秘吃什么通便快| 肺部结节挂什么科| 太子龙男装什么档次| 宫颈活检lsil是什么病| 减肥可以吃什么主食| 封闭针是什么药| 普乐安片治什么病| 不爽是什么意思| 淋巴细胞比率偏高是什么意思| 泡腾片是干什么用的| 黑色裤子配什么颜色t恤| 受精卵着床有什么感觉| 螯合是什么意思| 按摩脚底有什么好处| 张牙舞爪是什么生肖| 厘米为什么叫公分| 支气管炎用什么药| 紫色五行属什么| 次方是什么意思| 女生是党员有什么好处| 1999年属兔是什么命| 竹子开花意味着什么| 身上没力气没劲是什么原因| 快闪是什么意思| 伤口流水是什么原因| 一只眼皮肿是什么原因| 上海虹桥医院属于什么医院| 飞黄腾达是什么意思| 罚金属于什么处罚| 病灶是什么意思| 养老金什么时候可以领取| 晚上吃什么不长肉| 流产后吃什么药| 林俊杰为什么不结婚| 曹操是什么时期的人| 阴道里面有个肉球是什么| 便秘吃什么药效果最好| 腿疼吃什么药| aspirin是什么意思| 碱性磷酸酶低是什么原因| 尿毒清颗粒主治什么病| 袋鼠属于什么类动物| 脚痛去医院挂什么科| 高血糖是什么原因引起的| 肝肾两虚吃什么中成药| 回奶是什么意思| 变应原皮内试验是测什么的| 拆穿是什么意思| nd是什么意思| 什么叫批次线| 六五年属什么| touch是什么意思| 真丝姆米是什么意思| hrd什么意思| 5月是什么月| 翻毛皮是什么材质| 干是什么意思| 澳大利亚说什么语| 蝴蝶骨是什么| 什么是胶体| 骨髓水肿是什么意思| u是什么意思| 什么是树莓| 手机充电口叫什么| 强直性脊柱炎有什么症状| 周瑜是什么生肖| 跳楼是什么感觉| 养胃吃什么| 围绝经期什么意思| 不均质回声是什么意思| 女司机为什么开不好车| 彬字五行属什么| ccu是什么| 什么牌子的充电宝好| 一加一笔变成什么字| 7月25号是什么星座| 特诊科是什么意思| 左眼皮一直跳是什么预兆| 米色配什么颜色好看| 薪字五行属什么| 梦见奶奶死了是什么意思| 钾低是什么原因| 几月初几是叫什么历| 泡妞是什么意思| 舌苔白厚吃什么药见效快| fda是什么| 火华读什么| 吃了吐是什么原因| 非萎缩性胃炎吃什么药| 广东有什么烟| 浪琴军旗什么档次| 病理是什么意思| 佛家思想的核心是什么| 碳14阴性是什么意思| 着床出血是什么样子的| 痔疮吃什么消炎药好得快| 指甲黄是什么原因| 下腹部胀是什么原因| 5点至7点是什么时辰| 手脚出汗什么原因| 鸡涌是什么意思| 一般什么人容易得甲亢| 什么人不能喝大麦茶| 喉结不明显的男生是什么原因| 心存芥蒂是什么意思| 有白痰是什么原因| 乳房钙化灶是什么意思| 肝回声稍密是什么意思| 介入手术是什么意思| 牙齿涂氟是什么意思| 吸烟有什么危害| 什么是阴虚| saa偏高说明什么| x片和ct有什么区别| 眼睛干涩模糊用什么眼药水| 顺手牵羊是什么生肖| 司空见惯什么意思| 下午头晕是什么原因引起的| 1957年属什么| 手心发痒是什么原因| 白带发黄有异味用什么药| 脾脏结节一般是什么病| 萤火虫吃什么食物| 头皮发紧是什么病的前兆| 怀孕不能吃什么药| 免疫力低吃什么| 头发长的快是什么原因| 梦见吃樱桃是什么意思| 三月20号是什么星座| 蟋蟀吃什么食物| 南京区委书记什么级别| 三文鱼和什么不能一起吃| 嘴巴发苦是什么原因| 广字五行属什么| 吃什么菜能降血糖| 故宫什么时候闭馆| 汐字五行属什么| 喝酒肚子疼是什么原因| 5月30是什么星座| 什么腿| 表示什么意思| 寅时五行属什么| 果酸有什么作用| 四面八方是什么意思| 香精是什么东西| 姑姐是什么意思| 印度洋为什么叫印度洋| 青色是什么色| 33年属什么生肖| 全科是什么科| 人造海蜇丝是什么做的| 梦到手机丢了什么预兆| pms是什么| 脖子下面的骨头叫什么| 钟乳石是什么| ab和b型血生的孩子是什么血型| 肝胆湿热喝什么茶| 黄瓜为什么是苦的| 2025是什么生肖年| 抽烟打嗝是什么情况| 膀胱ca是什么意思| 活性印染是什么意思| 下海的意思是什么| dwi是什么意思| 湿疹擦什么药| 开边珠牛皮是什么意思| 急性肠胃炎吃什么药效果好| 怀孕吃什么宝宝会白| 我方了是什么意思| 青椒炒什么| 为什么肝最怕吃花生| 凌晨两点是什么时辰| 十二月二十三是什么星座| 歼是什么意思| 什么是黑天鹅事件| 千秋无绝色悦目是佳人什么意思| 百合什么时候种| tct和hpv有什么区别| 生肖鸡和什么生肖最配| 羊猄皮是什么皮| 百度

ShaderLab中的CG语言

CG语句写在哪

百度 本版采写/新京报记者曾金秋

CG需要写在Pass中,在CGPROGRAM和ENDCG之间

pragma申明编译指令

定义实现 顶点/片元着色器 代码的函数名称

pragma vertex 名字(实现顶点着色器的函数名)

pragma fragment 名字(实现片元着色器的函数名)

作用:将顶点/片元着色器实现 定位到这两个函数名中

因此只要在这两个函数中书写shader逻辑

数据类型

基础数据类型

1750865901341

区别:half(16位浮点数)、fixed(12位浮点数)、sampler(纹理对象句柄)

复合数据类型

一维数组

申明:int a[4] = {1,2,3,4}

长度:a.length

二维数组

int b[2][3] = {{1,2,3},{4,5,6}}

行:b.length

列:b[0].length

结构体

区别:结构体申明结束后加分号,一般在函数外申明

1750867313446

1750867381864

特殊数据类型

向量

1750880461911

                //二维向量
                fixed f2 = fixed2(1.2,2.5);
                //三维向量
                float3 f3 = float3(2,3,4);
                //四维向量
                int4 i4 = int4(1,2,3,4);

矩阵

1750880492452

                //矩阵
                int2x3 mInt2x3 = int2x3(1,2,3,
                                        4,5,6);
                float3x3 mFloat3x3 = float3x3(1,2,3,
                                              4,5,6,
                                              7,8,9);
                fixed4x4 mFloat4x4 = fixed4x4(1,2,3,4,
                                              5,6,7,8,
                                              9,10,11,12,
                                              13,14,15,16);

bool类型的特殊使用

1750880698205

                //bool的特殊使用
                float3 a = float3(1,2,3);
                float3 b = float3(4,5,6);
                bool3 c = a > b;
                //运行后的结果为bool3(false,false,false)

总结:

1750880952034

Swizzle操作符

用.的形式使用,后面跟着所需的分量顺序

对于四维向量,可以用:向量.xyzw / 向量.rgba

前者表示坐标,后者表示颜色通道

                fixed4 f4 = fixed4(1,2,3,4);

提取分量:

                //提取分量:
                //xyzw,rgba
                //第一个分量
                fixed f = f4.x;
                f = f4.r;
                //第二个分量
                f = f4.y;
                f = f4.g;

重新排列分量:

                //重新排列:
                f4 = f4.yzxw;
                f4 = f4.abgr;

创建新向量:

                //创建新的向量
                fixed3 f3 = f4.xyz;
                fixed2 f2 = f4.xz;
                fixed4 f4_2 = fixed4(f2,f2);//升维需要补齐
                f4_2 = fixed4(f3,f);//升维需要补齐

向量和矩阵的更多用法

把矩阵当作二维数组来用

用向量申明矩阵:

                fixed4x4 f4x4 = {fixed4(1,2,3,4),
                                fixed4(5,6,7,8),
                                fixed4(9,10,11,12),
                                fixed4(13,14,15,16)};
                f4x4 = {f4,
                        f4,
                        f4,
                        f4};

获取矩阵中的元素:

和获取二维数组的元素一样

                f = f4x4[0][0];

利用向量获取矩阵中的某一行:

                f4_2 = f4x4[0];

高维转低维:

直接赋值,自动在高维矩阵(向量)中截取低维矩阵(向量)部分

                fixed3 f3_2 = f4;
                f2 = f4;
                fixed2x2 f2x2 = f4x4;

运算符相关

三目运算符:和C#一样

逻辑运算符: || && ! ,不存在短路,所以不管逻辑运算符满不满足都会执行完所有条件

数学运算符:CG中的取余%只能对整数取余,这和C语言一样

流程控制语句

和C#一样

注意:CG需要更多的考虑性能消耗

  1. 尽量少使用循环语句,并减少次数和复杂度
  2. 利用GPU并行性来替代循环
  3. 尽量避免复杂的条件分支

函数

in和out可以有多个

无返回值:

参数有in,out之分

1750885441835

输入参数不改,输出参数必须初始化/修改,可以在外部调用

in和out关键字可以省略,但最好不要这么做

有返回值:

参数只有in

1750885934761

对于顶点vert / 片元着色器frag函数只会用单返回值进行处理

顶点/片元着色器的基本结构

            #pragma vertex myVert
            #pragma fragment myFrag
            //顶点着色器 回调函数
            //POSITION 和 SV_POSITION 是CG语言的语义
            //POSITION 模型的顶点坐标,填充到输入参数v中
            //SV_POSITION 裁剪空间中的顶点坐标,填充到输出参数SV_POSITION中

            //语义是用来限定输入输出参数,让渲染器知道用户的输入输出是什么
            float4 myVert(float4 v:POSITION):SV_POSITION{
                //mul():矩阵/向量的相乘
                //UNITY_MATRIX_MVP:Unity内置的变换矩阵,是Unity内置模型、观察、投影矩阵的集合
                //v:顶点坐标
                return mul(UNITY_MATRIX_MVP, v);
                //新版本把这个封装成了UnityObjectToClipPos(v)
            }
            //片元着色器 回调函数
            //SV_Target 告诉渲染器,输出参数是SV_Target,
            // 渲染器会把用户输出颜色储存到一个渲染目标中,输出到默认的帧缓存中
            fixed4 myFrag(): SV_Target
            {
                return fixed4(1, 0, 0, 1);
            }

效果:

1750888357619

1750888380916

语义——特殊关键字

修饰 函数的传入参数和返回值

作用:让Shader知道从哪里读取数据,并输出到哪里去

unity只支持CG的部分语义

常用语义

应用阶段->顶点着色器

1750890814935

顶点着色器->片元着色器

1750891479552

片元着色器的输出

1750891602075

其他语义

HLSL语义,CG语义

顶点/片元着色器获取更多数据信息

顶点着色器获取更多数据信息

使用结构体对数据封装,通过对结构体中的成员变量+语义的方式来定义想要获取的信息

            struct a2v{
                //顶点坐标
                float4 vertex : POSITION;
                //顶点法线
                float3 normal : NORMAL;
                //纹理坐标
                float2 uv : TEXCOORD0;
            };

            float4 myVert(a2v data):SV_POSITION
            {

                return UnityObjectToClipPos(data.vertex);

            }

片元着色器获取更多数据信息

片元着色器输入的数据基本都是由顶点着色器传递的

封装的结构体还需要顶点着色器的返回类型

            v2f myVert(a2v data)
            {
                //传给片元着色器的数据结构体
                v2f v2fData;
                v2fData.pos = UnityObjectToClipPos(data.vertex);
                v2fData.normal = data.normal;
                v2fData.uv = data.uv;

                return v2fData;

            }

            
            fixed4 myFrag(v2f data): SV_Target
            {
                return fixed4(0,1,0,1);
            }

ShaderLab属性类型和CG变量类型的匹配关系

Shader三大属性:数值、颜色和向量,纹理贴图

1750918428378

1750918510595

1750918537365

1750918557996

    Properties
    {
        //整形
        _MyInt("My Int", Int) = 10
        //浮点型
        _MyFloat("My Float", Range(0,1)) = 0.5
        //范围型
        _MyRage("My Range", Range(0,10)) = 5
      
        //颜色
        _MyColor("My Color", Color) = (1,1,1,1)
        //向量
        _MyVector("My Vector", Vector) = (1,1,1,1)
        //2D纹理
        _My2D("My2D", 2D) = "white" {}
        //2D数组纹理
        _My2DArray("My2DArray", 2DArray) = "white" {}
        //Cube map 纹理
        _MyCube("MyCube", Cube) = "white" {}
        //3D纹理
        _My3D("My3D", 3D) = "white" {}

    }

1750918820178

CG中变量类型对应的ShaderLab属性类型

1750918860205

如何在CG语句块中使用ShaderLab中申明的属性

直接在CG语句块中申明和属性对应类型的同名变量

            CGPROGRAM
            #pragma vertex myVert
            #pragma fragment myFrag

            float _MyInt;
            float _MyFloat;
            float _MyRage;
            fixed4 _MyColor;
            float4 _MyVector;
            sampler2D _My2D;
            samplerCUBE _MyCube;
            sampler3D _My3D;

CG内置函数

1.数学函数

三角函数

1750919262968

向量、矩阵

1750919300532

数值相关

1750919372181

1750919407561

其他

1750919438702

2.几何函数

1750919483250

3.纹理函数

二维纹理

1750919543201

举例:

1750919583245

1750919604209

立方体纹理

1750919619240

其他纹理

1750919640314

CG内置文件

posted @ 2025-08-04 14:37  EanoJiang  阅读(7)  评论(0)    收藏  举报
当归和党参有什么区别 世界上最小的长度单位是什么 黑色属于什么五行属性 有因必有果什么意思 体外射精是什么
墨绿色大便是什么原因 舌强语謇是什么意思 枝柯是什么意思 领证需要准备什么 后年是什么生肖
小孩摇头是什么原因 hcho是什么意思 眼睛痒用什么药 公鸡为什么会啄人 三道鳞是什么鱼
众所周知是什么生肖 氨基酸什么牌子好 排卵期有什么感觉 504是什么意思 佝偻病什么症状
胺碘酮又叫什么名字gysmod.com 无公害什么意思hcv8jop2ns6r.cn 猴子捞月是什么生肖hcv8jop2ns3r.cn 乳腺增生什么意思hcv9jop3ns9r.cn 做梦吃鱼是什么意思fenrenren.com
流加金念什么hcv9jop5ns5r.cn 什么是跑马helloaicloud.com 牡丹花代表什么生肖hcv9jop1ns9r.cn 一国两制什么时候提出的hcv7jop9ns5r.cn 身份证是什么字体baiqunet.com
大便有点绿色是什么原因hcv9jop1ns8r.cn 安乃近片是什么药hcv8jop4ns3r.cn 呼吸困难气短是什么原因hcv7jop5ns3r.cn 做梦梦到狗是什么征兆hcv7jop9ns7r.cn 鹅肝为什么那么贵0735v.com
回执单是什么sanhestory.com 肩膀疼是什么原因引起的0735v.com 颅内缺血灶是什么病症weuuu.com 痛风是什么原因hcv7jop9ns0r.cn 吃什么增强免疫力最快dayuxmw.com
百度