Koo叔说Shader-CG语言介绍

unity cg hlsl glsl区别 在Unity游戏引擎中,你可能会遇到与着色器编程相关的几种不同的着色器语言,包括Cg、HLSL(High Level Shading Language)和GLSL(OpenGL Shading Language)。在Unity中编写着色器时,你应该根据目标平台和你想要实现的效果来选择合适的着色器语言和编程方法。ShaderLab是Unity中一种常见的着色器编程方法,它允许你使用类似HLSL的语法来编写跨平台的着色器代码。 阅读详情

前言

开始着手写Unity Shader之前,有必要了解一下用什么语言来写,Unity支持自家的Surface Shaders,GLSL,Cg/HLSL这几种方式来写,经过比较决定使用Cg/HLSL来写,今天就来初步学习一下Cg/HLSL语言,为接下来的使用做准备。

为什么Cg/HLSL是最佳选择

  • GLSL:Unity支持GLSL,这是OpenGL的Shader语言,在GLSLPROGRAM … ENDGLSL块中编写,Unity会将这部分代码编译到任何平台,但对Windows或游戏机支持的不好,如果只是做手游的Android和IOS平台,用Mac做开发可以选择GLSL.
  • Surface Shaders:可以用Unity shader库做很酷的东西。但在移动设备上不一定有效果。Shader库封装了许多功能,简化了开发,但同时也失去了对手游需要的控制和性能选项。Surface Shader只是自动帮你完成那些需要手写的、重复的通用代码。你仍然是要用CG/HLSL语言来编写Surface Shader。
  • Cg/HLSL:为什么要把Cg/HLSL放到一块呢。因为Cg和HLSL就是同一个语言只是由NVIDIA和Microsoft两家公司分别维护,现在NIVIDIA已经停止维护Cg了,Microsoft在维护HLSL.Cg/HLSL可以被编译到需要的任何设备,而且Unity和微软已经亲密的像兄弟一样,在Unity中新建shader,默认也是CG语言也就是HLSL语言,所以HLSL是Unity shader的首选。

先来看一段Unity中的CG程序

CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag           
            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                fixed4 color : COLOR;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                half2 texcoord : TEXCOORD0;
                fixed4 color : COLOR;
            };

            v2f o;

            v2f vert (appdata_t v)
            {
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
                o.color = v.color;
                return o;
            }

            fixed4 frag (v2f IN) : COLOR
            {
                return tex2D(_MainTex, IN.texcoord) * IN.color;
            }
            ENDCG

CG程序被放到CGPROGRAM…ENDCG的声明块中,指明这里是写CG语言。CG语言非常像C语言的语法,有C,C++,Java等基础的非常好掌握。

编译指令#pragma

告诉编译器需要用到的函数和一些编译项的设置
- #pragma vertex name–指定vertex顶点shader的函数,name是函数名
- #pragma fragment–指定fragment片段shader的函数
- #pragma geometry name–指定geometry几何shader的函数(DX10以上)
- #pragma hull name–指定hull外壳着色器 Shader(细分着色的部分,主要负责定义细分等级(LOD)和相关控制点在细分中的“形变”趋势,DX11)
- #pragma domain name–指定domain域着色器Shader(负责的最重要的功能就是通过贴图控制的方式,实现模型的形变,DX11)
- #pragma target name–指定编译目标版本以适应不同的GPU
- #pragma require feature-细粒度控制shader需要GPU的哪个特性
- #pragma only_renderers space separated names–只编译指定的渲染器,默认编译所有的渲染器
- #pragma exlude_renderers space separated names –不编译指定的渲染器
- #pragma multi_compile … -指定 multiple shader variants
- #pragma enable_d3d11_debug_symbols-为
- #pragma hardware_tier_variants renderer name–为每一个编译的shader生成 multiple shader hardware variants
-其中#pragma vertex 和 #pragma fragment必须有,其它视情况选择使用。

编译指令#include

这个和C,C++一样,表示包含外部的脚本文件。这里指包含Unity预先定义好的公共UnityCG.cginc库。

数据类型

  • 基本数据类型:float,half两种浮点类型,int整形,fixed定点数,bool布尔值,sampler*纹理对象句柄(sampler2D,sampler3D,samplerCUBE),string字符类型
  • 内置向量数据类型:float4,表示float类型的4元向量;bool4,表示bool类型4元向量,fixed4表示整型4元向量,可以声明float1,float2,float3,float4类型的数组变量,初始化方式为:float4 array=float4(1.0,2.0,3.0,4.0),其它一样;
  • 内置矩阵数据类型:最大的维数不能超过4X4阶。float4x4 matrix4;表示4X4阶矩阵,初始化方式为float2x2 matrix4 = {1.0,2.0,3.0,4.0},其它一样。
  • 数组:和C\C++声明方法一样:float4 b[10];向量和矩阵是内置数据类型,数组则是一种数据结构。
  • 结构体:Cg中的结构体的声明、使用和C++相似,一般用于传递数据类型较多的情况,参照上面例子的用法。
  • 类型转换和C一样,使用强制转换
  • 类型定义可在常量后跟后缀,有f,h,x(fixed),如2.0f,1.0h,3x

语义

通过语义绑定机制,指定数据存放的位置,即将输入\输出数据和寄存器做一个映射关系。
- POSITION:用于vertex shader 输入,输出,fragment shader的输入,代表位置信息
- NORMAL:用于vertex shader 输入,代表顶点法线
- BINORMAL:用于vertex shader输入,代表顶点次法线
- BLENDINDICES:用于vertex shader输入,代表四个影响顶点的骨骼的索引
- BLENDWEIGHT:用于vertex shader输入,代表四个骨骼影响顶点的加权百分比
- TANGENT:用于vertex shader输入,代表顶点切线空间
- PSIZE:用于vertex shader输入,输出,fragment shader的输入,代表点的大小Point size
- TEXCOORD0~TEXCOORD7:用于vertex shader输入,输出,fragment shader的输入,代表贴图
- FOG:vertex shader 输出,fragment shader 输入,代表雾
- COLOR0~COLOR1:vertex shader 输出,fragment shader 输入,代表颜色
- COLOR:fragment shader 输出,代表颜色
- SV_POSITION:SV_前缀的变量代表system value,DX10之后推荐使用SV_POSITION作为vertex shader的输出和fragment shader的输入,注意vertex shader的输入还是使用POSITION

语义绑定的几种形式

  • [const][in|out|inout][:][=]
  • struct {
    [:];
    };
  • ()[:

函数

函数的定义和声明,同C语法类似

内置函数库

  • reflect 求发射向量
  • refract 求折射向量
  • mul 矩阵相乘
  • normalize 归一化
  • 五大类: 数学函数、几何函数、纹理映射函数、调试函数

Swizzle操作符:

  • 可以使用Cg语言中的swizzle操作符(.)将一个向量的成员取出组成一个新的向量。
  • swizzle操作符后接x、y、z、w,分别表示原始向量的第一个、第二个、第三个、第四个元素
  • swizzle操作符后接r、g、b和a的含义与前者等同。不过为了程序的易读性,建议对于表示颜色值的向量,使用swizzle操作符后接r、g、b和a的方式。
  • 举例来说:float4(a, b, c, d).xyz 等价于float3(a, b, c)
    swizzle操作符只能对结构体和向量使用,不能对数组使用

特定关键字,修饰函数的参数

  • in:输入
  • out :输出
  • inout:输入输出
  • uniform (被修饰的变量从外部传入)
  • const: 常量

总结

以上就是CG的主要语法,比较好掌握,内置的函数,vertex shader,fragment shader的具体执行和调用方式,在真正写Shader后再慢慢学习,这篇主要是为之后的编写Shader做准备。

超强干货之---Python-数据爬取(爬虫) 定义: 深度优先搜索是一种遍历或搜索树或图的算法,从起始节点开始,一直沿着一个分支走到底,再回溯到上一个节点继续搜索下一个分支,直到遍历完所有节点。特点递归:通常用递归实现,或者使用栈来模拟递归过程。内存占用低:在有大量分支的情况下,内存占用比广度优先搜索低。适合目标较深的情况:如果目标节点距离起始节点较深,DFS能更快找到目标。适用场景需要遍历所有节点的情况,如生成树、迷宫搜索。目标节点较深,且分支较多时。在大规模数据爬取时,选择合适的存储方式取决于数据的规模、结构和访问需求。 阅读详情

相关推荐

汇川AM系列后台安全管理与用户权限的设置方法

汇川AM系列后台安全管理与用户权限的设置方法。

viixin的博客 8452

Shader的CG语言基础知识

Cg语言是为GPU编程设计的高级绘制语言,由NVIDIA公司开发。Cg极力保留C语言的大部分语义,并让开发者从硬件细节 中解脱出来,Cg同时也有一个高级语言的其他好处,如代码的易重用性,可读性得到提高,编译器代码优化。   Cg语言主要参照ANSI C建模,但也从C++和Java以及早期的绘制语言如RenderMan and the Stanford shading language中吸取了一...

Edwin Lee的博客 2664

自动驾驶嵌入式修炼秘籍:理想L9自动驾驶域控制器拆解

自动驾驶嵌入式修炼秘籍:理想L9自动驾驶域控制器拆解

pathfinder888的博客 2548

Unity里面CG和HLSL在写法上的一些区别

Unity里面CG和HLSL在写法上的一些区别

阿赵的博客 5111

RK3576+IMX415 MIPI摄像头零拷贝显示系统

MIPI CSI-2是嵌入式视觉系统中主流的高速图像传感器接口标准,其核心价值在于低延迟、高带宽与硬件级DMA直通能力。基于V4L2子系统与DRM/KMS驱动栈,可构建从传感器RAW数据到帧缓冲区的零拷贝通路,显著降低CPU负载并提升实时性。该技术广泛应用于工业检测、边缘AI推理前数据接入及多路同步采集等场景。本文以Rockchip RK3576 SoC和索尼IMX415传感器为典型组合,详解MIPI物理层适配、内核驱动集成、GStreamer零拷贝管道搭建及systemd服务化部署,覆盖从硬件信号完整性到

weixin_36047538的博客 216

单智能体篇:Prompt工程艺术

模型在接收到 Prompt 时会自动扮演“角色”,角色定义的好坏直接影响智能体输出的风格和专业性。角色定义的重要性让智能体具备明确身份,例如“你是一位专业理财顾问”或“你是一个幽默的文案创作助手”。角色限定了模型知识输出的范围,使回答更专业、更贴合预期。实战示例模糊Prompt给我一些投资建议。你可以投资股票或者基金。优化Prompt你是一位具有10年经验的专业理财顾问,请给我针对30岁男性,年收入20万,风险偏中等的投资组合建议。

公众号:AI前沿侦探 1301

2024-06-11 Unity Shader 开发入门5 —— CG 语法

​ Unity Shader 中的 CG 语言提供了各种用于图形编程的函数,这些函数是 CG 为封装好的逻辑,可以使用它们来编写 Unity Shader。UNITY_MATRIX_MV 的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到 UNITY_MATRIX_MV 的逆矩阵。​ 应用阶段传递模型数据给顶点着色器时 Unity 支持的语义,一般在顶点着色器回调函数的传入参数中应用。​ 从顶点着色器传递数据给片元着色器时 Unity 支持的语义, 一般在顶点着色器回调函数的返回值中应用。

zheliku的博客 2062

web渗透--9--识别web应用框架

1、概述 Web框架指纹识别是信息收集过程中的一个重要任务。获悉目标框架的类型必然为测试人员带来极大的优势,如果该框架在之前就被测试过。测试人员不仅可以获得未修补版本中存在的漏洞,还可以了解此框架中特有的错误配置以及已知的文件结构。从而使指纹识别过程显得格外重要。

武天旭的博客 5097

ShaderLab开发实战——Cg语言简介

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34101229的博客 1558

【2024年5月备考新增】《2024高项论文精华版(5)项目工作绩效域和度量绩效域》

3、专注于工作过程和能力。③专注于工作过程和能力。1、制定有效的度量指标。2、度量内容及相应指标。3、展示度量信息和结果。4、管理沟通和参与。7、监督新工作和变更。①制定有效的度量指标。②度量内容及相应指标。③展示度量信息和结果。5、基于度量进行诊断。

Else 的博客 1265

【微信小程序-uniapp】CustomPicker 自定义单项选择器组件

自定义底部弹出框单项选择器组件,适用于uniapp小程序

Komorebi_00的博客 1532

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

1:语法和C语言类是,有对应的编译器,程序是给显卡运行;2:可以从渲染流水线中获得对应的输入;3:指定的输出能流入下一个流水线模块;4:操作符号和C语言一样,可以使用+,-*/,

GarFe的博客 533

个人量化系统的策略集合与赚钱之道:全栈深度解析 + 与主流开源框架对比

前三篇把系统的"骨架"拆完了——架构、工程化、部署。本篇回答最关键的问题:一句话:别人的系统是"程序员的系统"(写代码才能加策略),daily_stock_analysis 是"股民的 YAML"(写中文就能加策略)。这个差异决定了它能在多大程度上真的帮你赚钱。如果你用过 、、,加一个策略的流程是: 问题在哪?在 daily_stock_analysis 里,“策略” = 一个文件。每个 YAML 是一个自然语言描述的交易策略,包括: 看到没? ——整个策略就是一段中文,零代码。任何会写字的人都能加新策略

shiter编写程序的艺术 151

Koo叔说Shader-调试Shader

前言 当写的Shader出现了一些不是预期的效果时,可能需要对Shader进行调试。但Shader不像其它语言能加断点debug,也不能打印输出。输出的只能是颜色值,所以可以将想要看的变量变换成颜色值,可视化的来查看问题,当然这需要一些小小的转换。 顶点数据从哪里来 一般对Shader调试,主要是调试顶点数据及变换,那么顶点数据是如何设置到Shader中的呢?在Unity中,是由Mesh...

koo叔的博客 2425

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Koo叔说Shader-- 熟悉渲染管线

前言 前面几篇文章对Shader及CG语言做了大概的介绍,算是为了编写Shader做的前期准备,但在真正写之前还是有必要把渲染管线再详细说一下,这样在写Shader时,才能更加清晰明白每一步的意义 渲染管线 渲染管线主要是用于3D渲染,可以理解为一个流程,即CPU方面准备一些数据传给GPU,GPU对数据处理得出一张二维图像的过程。渲染流程主要分为几个大的阶段 - 数据准备阶段 - 顶...

koo叔的博客 568

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Unity Shader学习三:Cg语言基础语法

观前提示:本文章是个人笔记,只是给自己看的,我自己看得懂就行。

miwuwu的博客 1154

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Shader编程学习笔记(九)—— Cg语言入门1 - 输入输出、语义、profile和基本数据类型

目录1、引言2、示例3、结束语 1、引言   这里我们开始了解CG语言。本篇涉及知识点: 输入输出 语义   这里我们使用一个示例来了解一个简单的shader的顶点和片段程序的输入输出以及常用语义。 2、示例   编写一个简单的顶点和片段着色器,代码如下: Shader "lxt610/fragmentVertexShader"{ SubShader{ pass{...

对酒当歌﹏✍ 1003

Shader学习之Cg语言一(Cg语言概述)

该篇博客是我自己在学习Shader时,看《GPU编程与CG语言之阳春白雪下里巴人 》Cg语言概述这章,觉得有些东西自己记不住,因此记录下来。Cg ToolKit下载地址: NVIDIA 的http://developer.nvidia.com/object/cg_toolkit.html 网页 下载之后直接安装即可。在安装目录的 bin 目录下一个可执行程序: cgc.exe 。这是 NVIDI

阳仔博客 4946

Shader属性讲解+Cg语言讲解

Cg支持的7种数据类型:1.float,2.half,3.int,4.fixed,5.bool,6.sampler*,7.string。矩阵的初始化方式为:float2x3 matrix5={1.0,2.0,3.0,4.0,5.0,6.0};对数组进行初始化的方式为:float a[4]={1.0,2.0,3.0,4.0};向量初始化的方式一般为:float4 array=float4(1.0,2.0,3.0,4.0);//等价于float3(d,c,b,a)

m0_74236534的博客 1121

CG函数

函数 :      自定义函数 :            自定义的函数必须要先声明才能被使用;            (1)、把函数定义在调用定制方法的方法(片段函数)前。            (2)、前向声明,前向声明方法的返回值类型、方法名和参数列表,一定没有方法体。      CG中所有的函数都是通过值拷贝进行传参,如果想要通过调用方法得到返回值进行赋值操作,可以通过ou

Young的博客 939

Unity Shader入门

这篇文章是我在学习蛮牛的一套关于Shader教程(http://www.unitytrain.cn/course/96)后的简单总结,个人感觉这套教程并不是以高级Shader编程为目的的,更像是授人以渔的宗旨。下面我会分为三个部分:Shader简述、图形学基础,Cg简介为大家介绍Shader的相关内容,也算是做一个总结。 一:Shader简述 a.先说一下GPU与CPU的区别,简单...

weixin_30735391的博客 332

Unity Shader学习日记 part5 CG基础

ShaderLab的属性和CG变量类型的对应ShaderLabCG类型使用是在CG中声明对应类型的同名变量即可。

weixin_70808146的博客 967

UntiyShader(六)Unity提供的Cg/HLSL语义

在之前的案例中我们可以看到,我们编写Shader时会用到一些语义,例如S等。语义实际上就是一个赋给Shader输入和输出的字符串,这个字符串表达了这个参数的含义。通俗来讲,这些语义可以让Shader知道从哪里读取数据,并把数据输出到哪里,它们在Cg/HLSL的Shader流水线中是不可或缺的,但需要注意的是Unity并没有支持所有的语义。通常情况下,这些输入输出变量并不需要有特别的意义,也就是说我们可以自行决定这些变量的用途。

米芝鱼的博客 1460

Shader编程学习笔记(十一)—— Cg语言入门3 -流程控制

目录1、引言2、示例2.1、验证switch...case条件语句2.2、if...else条件语句2.3、if...else条件语句 1、引言   这一篇我们我们来了解下流程控制语句,在CG语言中支持条件语句和循环语句。 if…else 条件语句 while 循环 do … while 循环 for 循环 需要注意的是早期版本Cg不支持switch…case语句,但是保留了这些关键字!但...

对酒当歌﹏✍ 1128

关于Unity中Cg的基本语法和使用

Cg是类似于C语言的发展起来的图形编程语言,Cgraphics,它的很多表达式if...else...和C语言非常相像,也和C#非常相像。  由于Shader是写给显卡执行的,所以没有输出语句来调试,很多地方调试不了,只能靠Unity编辑器来帮我们报错,写起来一定要小心谨慎。     基本类型表达式1:语法和C语言类是,有对应的编译器,程序是给显卡运行;2: 可以从渲染流水线中获得对应的输入;3:...

weixin_33782386的博客 530

Cg语言入门四之流程控制

未解决的问题:当颜色值只在vert函数中声明后,颜色不显示,球体是黑色的 一、switch..case语句 Shader "Custom/process_control" { SubShader { pass{ CGPROGRAM #pragma vertex vert #pragma fragment frag void vert(in floa

nicolelili1的专栏 553
上一篇: Koo叔说Shader-Unity中的Shader
下一篇: Koo叔说Shader-- 熟悉渲染管线
小城码仔
博客等级 码龄18年 99粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值