Shader属性讲解+Cg语言讲解
CPU调用GPU传递数据
修改Render组件的material属性
在脚本中更改游戏物体材质颜色代码示例:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestFixedColor : MonoBehaviour
{void Start(){//创建预制体GameObject prefab = Resources.Load<GameObject>("Prefabs/TestFixedColor");//创建到场景中GameObject testFixedColor=Instantiate<GameObject>(prefab);//获得MeshRender(材质在渲染器下)MeshRenderer meshRenderer= testFixedColor.GetComponent<MeshRenderer>();//获得材质,修改Shader的颜色属性//render.material可以获得材质球//材质下面的SetXXX()函数,可以修改材质球的属性,材质球的属性和Shader有关联关系//所以修改材质球的属性,进而会影响到shader的执行//参数1:shader中需要修改的属性名称//参数2:需要修改的值//meshRenderer.material.SetColor("_Color",Color.blue);//设置自定义颜色meshRenderer.material.SetColor("_Color", new Color(59f/255f,118f/255f,72f/255f,1f));}
}
Shader支持的属性类型
颜色:向Shader传递颜色值
浮点数:传递数字,作为阈值
范围:具有最大值,最小值的数
四维向量:传递一个向量或点
2D纹理
MipMaps:一个纹理存储时,会生成多个质量的纹理,根据摄像机和物体的距离,
显示相应质量的纹理
Rect纹理
和2D纹理类似,不支持MipMaps
Cube纹理
实现天空盒,实现金属对全局环境的反光
以上纹理在Shader文件中的示例:
Shader "CreateTest/FixedTexture"
{Properties{//2D纹理属性_MainTex("主纹理",2D) = "white"{}//Rect纹理_RectTex("Rect纹理",Rect)=""{}//盒子纹理_CubeTex("Cube纹理",Cube)=""{}//浮点常数_Float("浮点数",Float)=12//齐次坐标(点,向量)_Vector("齐次坐标",Vector)=(1,1,1,0)//数字范围_Range("透明度范围",Range(0,1))=1}SubShader{Pass{//固定管线着色器贴纹理SetTexture[_MainTex]{//将设置的纹理合并到物体上Combine texture}}}
}
材质球相关显示:


Cg语言介绍
可编程管线语言(3种)
GLSL:支持OpenGL接口
HLSL:支持DirectX接口
Cg:C for Graphic,支持两种图形化接口,由NVIDIA开发,Cg允许对顶点变换和
像素着色进行编程
介绍
Cg支持的7种数据类型:1.float,2.half,3.int,4.fixed,5.bool,6.sampler*,7.string。
Cg提供了内置的向量数据类型(built-in vector data types),内置的向量数据类型
基于基础数据类型。
例如:float4,表示float类型的四元向量。
注意:向量最长不能超过四元,即在Cg程序中可以声明float1,float2,float3,float4
类型的数组变量,但是不能声明超过四元的向量。
向量初始化的方式一般为:float4 array=float4(1.0,2.0,3.0,4.0);
Cg提供矩阵数据类型,不过最大的维数不能超过4*4阶。
例:float4x2 matrix3;//表示4*2阶矩阵,包含8个float类型数据。
矩阵的初始化方式为:float2x3 matrix5={1.0,2.0,3.0,4.0,5.0,6.0};
着色程序中,数组通常使用的目的:作为从外部应用程序传入大量参数输出到Cg
的顶点程序中的形参接口。
简言数组数据类型在Cg程序中的作用是:作为函数的形参,用于大量数据的传递。
Cg声明数据变量:
float a[10];//声明一个数组,包含10个float类型数据
float4 b[10];//声明一个数组,包含10个float4类型向量数据
对数组进行初始化的方式为:float a[4]={1.0,2.0,3.0,4.0};//初始化一个数组
获取数组长度:float a[2]={1.0,2.0}; int nLen=a.Length;
声明多维数组以及初始化的方式如下所示:
float b[2][3] = {{0.0,0.0,0.0},{1.0,1.0,1.0}};
对多维数组取长度的方式为:
int length1=b.length; //length1值为2
int length2=b[0].length;//length2值为3
数组和矩阵有些类似,但并不相同
例:4*4阶数组的声明:float M[4][4];
4阶矩阵的声明方式:float4x4 M;
前者是一个数据结构,包含16个float类型数据,后者是一个4阶矩阵数据。
注意:进行数组变量声明时,一定要指定数组长度,除非是作为函数参数而声明
的形参数组。
Cg语言支持结构体(structure),实际上Cg中的结构体的声明、使用和C++非常
类似(只是类似,不是相同)。
声明一个该结构体类型的变量,代码如下:
struct myAdd
{float val;float add(float x){return val+x; }
};
myAdd s;
注意:在当前的所有的profile版本下,如果结构体的一个成员函数使用了成员变量,
则该成员变量要声明在前。此外,成员函数是否可以重载依赖于使用的profile版本。
Cg中的类型转换和C语言中的类型转换很类似,C语言中类型转换可以是强制类
型转换,也可以是隐式转换,如果是后者,则数据类型从低精度向高精度转换。
在Cg语言中也是如此。例:
float a = 1.0;
half b=2.0;
float c=a+b;//等价于float c=a+(float)b\
Cg语言中对于常量数据可以加上类型后缀,表示该数据的类型,例如:
float a = 1.0;
float b=a+2.0h;//2.0h为half类型常量数据,运算是需要做类型转换
常量的类型后缀(type suffix)有3种:
1.f:表示float;
2.h:表示half;
3.x:表示fixed;
Cg语言表达式允许对向量使用所有的boolean operator,如果是二元操作符,则被操
作的两个向量的长度必须一致。表达式中向量的每个分量都进行一对一的运算,最
后返回的结果是一个bool类型的向量,长度和操作数向量一致。例如:
float3 a = float3(0.5,0.0,1.0);
float3 b=float3(0.6,-0.1,0.9);
bool3 c = a<b;
运算后向量c的结果为bool3(true,false,false);
逻辑操作符也可以对向量使用,返回的变量类型是同样长度的内置bool向量。
C/C++的宏:函数是调用结构,宏是替换代码。
注意:Cg中的逻辑与(&&)和逻辑或(||)不存在C中的短路现象(short-circuiting,
即只用就算一个操作数的bool值即可),而是参与运算的操作数据都进行bool分析。
短路现象
bool con1=true
int a = 10
int b = 20
con1||(a>b)
con1如果为true,在C中,ab的值不会比较,但是Cg会比较所有条件
$a=true
$a||$b=true
if(!$a){
$b=true
}
Cg语言对向量的数学操作提供了内置的支持,需要注意的是:求余操作符%。只能在
int类型数据间进行,否则编译器会提示错误信息:
error C1021:operands to "%" must be integral.
可以使用Cg语言中的swizzle操作符(.)将一个向量的成员取出组成一个新的向
量。swizzle操作符被GPU硬件高效支持。
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)
float4(a,b,c,d).xyy;//等价于float3(a,b,b)
float4(a,b,c,d).wzyx;//等价于float3(d,c,b,a)
float4(a,b,c,d).w;//等价于float d
注意:Swizzle操作符只能对结构体和向量使用,不能对数组使用。
Cg中的控制流语句和循环语句与C语言类似。
条件语句有:if,if-else,if-else if-else;
循环语句有:while,for;
break,continue语句可以在for和while语句中使用。
Cg中创造了一系列独特的关键字,这些关键字不但用于指定输入图元的数据含义
(是位置信息,还是法向量信息),本质也则对应着这些图元数据存放的硬件资源
(寄存器或者纹理),称之为语义词(Semantics),通常也根据其用法称之为绑
定语义词(binding semantics)。
除语义词外,Cg中还提供了三个关键字:in,out,inout。用于表示函数的输入参数的
传递方式,称为输入\输出关键字,这组关键字可以和语义词合用表达硬件上不同的
存储位置,即同一个语义词,使用in关键字修辞和out关键词修辞,表示的图形硬件
上不同的寄存器。
Cg语言还提供两个修辞符:uniform用于指定变量的数据初始化方式;const关键字
表示被修辞变量为常量变量。
Cg语言将数据流分为两类:
1.Varying inputs,即数据流输入图元信息的各种组成要素。
2.Uniform inputs,表示一些与三维渲染有关的离散信息数据,这些数据通常由应用程
序传入,并通常不会随着图元信息的变化而变化,如材质对光的反射信息,运动矩阵
等。
注意:uniform修辞的变量的值是从外部传入的,所以Cg程序(顶点程序和片段程序)
中通常使用uniform参数修辞函数形参,不容许声明一个用uniform修辞的局部变量!
Cg输入语义与输出语义的区别
语义:是两个处理阶段(顶点程序、片段程序)之间的输入/输出数据和寄存器之间
的桥梁,同时语义通常也表示数据的含义,如POSITION一般表示参数种存放的数据
是顶点位置。
语义:只对两个处理阶段的输入/输出数据有意义,也就是说语义只有在入口函数中才
有效,在内部函数(一个阶段的内部处理函数,和下一个阶段没有数据传递关系)的
无效,被忽略。
语义:分为输入语义和输出语义,输入语义和输出语义是有区别的
Cg常用语义:
POSITION,BLENDWEIGHT,NORMAL,TANGENT,BINORMAL,PSIZE,BLENDINDICES,
TEXCOORD0---TEXCOORD7
参数使用语义使用举例:in float4 modelPos:POSITION
顶点着色程序的输出语义:示例代码
void main v(float4 position:POSITION,out float4 oposition:POSITION,uriform float4x4 modelViewProj)
{//oposition=mul(modelViewProj,position);
}
为了保持顶点程序输出语义和片段程序输入语义的一致性,通常使用相同的struct类型
数据作为两者之间的传递,这是一种非常方便的写法,推荐使用。例如:
struct VertexIn{
float4 position:POSITION;
float4 normal:NORMAL;
};
struct VertexScreen{
float4 oPosition:POSITION;
float4 objectPos:TEXCOORD0;
float4 objectNormal:TEXCOORD1;
};
注意:当使用struct结构中的成员变量绑定语义时,需要注意到顶点着色程序中使用
的POSITION语义词,是不会被片段程序所使用的。
语义绑定方法
入口函数输入\输出数据的绑定语义有四种方法:
1.绑定语义放在函数的参数列表的参数声明后面中:
[const][in|out|inout]<type><identifier>[:<binding-semantic>][=<initializer>]
2.绑定语义可以放在结构体(struct)的成员变量后面:
struct <struct-tag>{
<type><identifier>[:<binding-semantic>];
};
3.绑定语义词可以放在函数声明的后面,其形式为:
<type><identifier>(<parameter-list>)[:<binding-semantic]{
<body>
}
4.最后一种语义绑定的方法是,将绑定语义词放在全局非静态变量的声明后面。其形
式为:
<type><identifier>[:<binding-semantic>][=<initializer>];
Cg标准函数库
和C的标准函数库类似,Cg提供了一系列内建的标准函数。这些函数用于执行数学上
的通用计算或通用算法(纹理映射等)。
Cg标准函数库主要分为五个部分:
1.数学函数(Mathematical Functions);
2.几何函数(Geometric Functions);
3.纹理映射函数(TextureMapFunctions);
4.偏导数函数(Derivative Functions);
5.调试函数(Debugging Function);
该系列专栏为网课课程笔记,仅用于学习参考。
相关文章:
Shader属性讲解+Cg语言讲解
CPU调用GPU传递数据 修改Render组件的material属性 在脚本中更改游戏物体材质颜色代码示例: using System.Collections; using System.Collections.Generic; using UnityEngine;public class TestFixedColor : MonoBehaviour {void Start(){//创建预制体GameObjec…...
基于LightGBM-TPE算法对交通事故严重程度的分析与可视化
基于LightGBM-TPE算法对交通事故严重程度的分析与可视化 原文: Analysis and visualization of accidents severity based on LightGBM-TPE 1. 引言部分 文章开篇强调了道路交通事故作为意外死亡的主要原因,引起了多学科领域的关注。分析事故严重性特…...
什么是CRM系统,它的作用是什么?CRM全面指南
CRM(Customer Relationship Management,客户关系管理)系统是一种专门用于集中管理客户信息、优化销售流程、提升客户满意度、支持精准营销、驱动数据分析决策、加强跨部门协同、提升客户生命周期价值的业务系统工具。其中,优化销售…...
MySQL 启动报错:InnoDB 表空间丢失问题及解决方法
MySQL 启动报错:InnoDB 表空间丢失问题及解决方法 在启动 MySQL 时,遇到了如下错误: 2025-01-16T12:43:28.341240Z 0 [ERROR] InnoDB: Tablespace 5975 was not found at ./my_jspt/sw_rtu_message_202408.ibd. 2025-01-16T12:43:28.341244…...
MYSQL之库的操作
创建数据库 语法很简单, 主要是看看选项(与编码相关的): CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 1. 语句中大写的是…...
笔记本电脑研发笔记:BIOS,Driver,Preloader详记
在笔记本电脑的研发过程中,Driver(驱动程序)、BIOS(基本输入输出系统)和 Preloader(预加载程序)之间存在着密切的相互关系和影响,具体如下: 相互关系 BIOS 与 Preload…...
同样的html标记,不同语言的文本,显示的字体和粗细会不一样吗
同样的 HTML 标记,在不同语言的文本下,显示出来的字体和粗细确实可能会不一样,原因如下: 🌍 不同语言默认字体不同 浏览器字体回退机制 CSS 里写的字体如果当前系统不支持,就会回退到下一个,比如…...
JavaScript 笔记 --- part 5 --- Web API (part 3)
(webAPI part3) BOM 操作 JS 执行机制 javascript 是单线程的, 也就是说, 只能同时执行一个任务。 为了解决这个问题, 利用多核 CPU 的计算能力, HTML5 提出 Web Worker API, 允许 JavaScript 脚本创建多个线程, 并将任务分配给这些线程。 于是, JS 出现了同步和异步的概念。…...
Linux 下的网络管理(附加详细实验案例)
一、简单了解 NM(NetworkManager) 在 Linux 中,NM 是 NetworkManager 的缩写。它是一个用于管理网络连接的守护进程和工具集。 在 RHEL9 上,使用 NM 进行网络配置,ifcfg (也称为文件)将不再…...
基于SpringBoot的疫情居家检测管理系统(源码+数据库)
514基于SpringBoot的疫情居家检测管理系统,系统包含三种角色:管理员、用户、医生,主要功能如下。 【用户功能】 1. 首页:获取系统信息。 2. 论坛:参与居民讨论和分享信息。 3. 公告:查看社区发布的各类公告…...
关于系统架构思考,如何设计实现系统的高可用?
绪论、系统高可用的必要性 系统高可用为了保持业务连续性保障,以及停机成本量化,比如在以前的双十一当天如果出现宕机,那将会损失多少钱?比如最近几年Amazon 2021年30分钟宕机损失$5.6M。当然也有成功的案例,比如异地…...
MATLAB 控制系统设计与仿真 - 35
MATLAB鲁棒控制器分析 所谓鲁棒性是指控制系统在一定(结构,大小)的参数扰动下,维持某些性能的特征。 根据对性能的不同定义,可分为稳定鲁棒性(Robust stability)和性能鲁棒性(Robust performance)。 以闭环系统的鲁棒性作为目标设计得到的…...
性能比拼: Nginx vs Caddy
本内容是对知名性能评测博主 Anton Putra Nginx vs Caddy Performance 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 引言 在本期视频中,我们将对比 Nginx 和 Caddy---一个用 Go 编写的 Web 服务器和反向代理。 在第一个测试中,我们会使用…...
C++项目-衡码云判项目演示
衡码云判项目是什么呢?简单来说就是这是一个类似于牛客、力扣等在线OJ系统,用户在网页编写代码,点击提交后传递给后端云服务器,云服务器将用户的代码和测试用例进行合并编译,返回结果到网页。 项目最大的两个亮点&…...
李宏毅NLP-6-seq2seqHMM
比较seq2seq和HMM Hidden Markov Model(HMM) 隐马尔可夫模型(HMM)在语音识别中的应用,具体内容如下: 整体流程: 左侧为语音信号(标记为 “speech”),其特征表示为 X X X。中间蓝色模…...
百度暑期实习岗位超3000个,AI相关岗位占比87%,近屿智能携AIGC课程加速人才输出
今年3月,百度重磅发布3000暑期实习岗位,聚焦大模型、机器学习、自动驾驶等AI方向的岗位比例高达87%。此次实习岗位涉及技术研发、产品策划、专业服务、管理支持、政企解决方案等四大类别,覆盖超300个岗位细分方向。值得一提的是,百…...
【技术派后端篇】基于 Redis 实现网站 PV/UV 数据统计
在网站的数据分析中,PV(Page View,页面浏览量)和 UV(Unique Visitor,独立访客数)是两个重要的指标,几乎每个网站都需要对其进行统计。市面上有很多成熟的统计产品,例如百…...
JAVA:利用 Apache Tika 提取文件内容的技术指南
1、简述 Apache Tika 是一个强大的工具,用于从各种文件中提取内容和元数据。📄Tika 支持解析文档、📸图像、🎵音频、🎥视频文件以及其他多种格式,非常适合构建🔍搜索引擎、📂内容管理系统和📊数据分析工具。 样例代码:https://gitee.com/lhdxhl/springboot-…...
【AI】SpringAI 第二弹:接入 DeepSeek 官方服务
一、接入 DeepSeek 官方服务 通过一个简单的案例演示接入 DeepSeek 实现简单的问答功能 1.添加依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency> 2…...
XMLXXE 安全无回显方案OOB 盲注DTD 外部实体黑白盒挖掘
# 详细点: XML 被设计为传输和存储数据, XML 文档结构包括 XML 声明、 DTD 文档类型定义(可 选)、文档元素,其焦点是数据的内容,其把数据从 HTML 分离,是独立于软件和硬件的 信息传输…...
SQL之DML(查询语句:select、where)
🎯 本文专栏:MySQL深入浅出 🚀 作者主页:小度爱学习 select查询语句 在开发中,查询语句是使用最多,也是CRUD中,复杂度最高的sql语句。 查询的语法结构 select *|字段1 [, 字段2 ……] from 表…...
Oracle--用户管理
前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 用户管理在 Oracle 数据库中至关重要。一个服务器通常只运行一个 Oracle 实例,而一个 Oracle 用户代表一个用户群,他们通过该用…...
MYDB仿MySQL手写数据库项目总结
声明:该项目是一个开源项目,我是在学习该项目,该项目的github地址如下: MYDB项目地址:https://github.com/CN-GuoZiyang/MYDB MYDB项目采用C/S结构,支持启动一个服务器,并有多个客户端去连接…...
24.中医知识问答删除历史对话功能前端代码实现
前端实现对话删除功能的完整指南 功能概述 前篇文章介绍了删除历史对话的后端开发,本篇将介绍如何在前端实现一个完整的对话删除功能,包括用户确认、API调用、状态管理和错误处理等关键环节。 功能拆解 1. 用户确认机制 javascript const confirmDe…...
git忽略已跟踪的文件/指定文件
在项目开发中,有时候我们并不需要git跟踪所有文件,而是需要忽略掉某些指定的文件或文件夹,怎么操作呢?我们分两种情况讨论: 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…...
RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系
以下是 RAG(检索增强生成)、ReAct(推理与行动) 和 多模态AI 的详细解析,包括三者的定义、工作原理、应用场景及协同关系: 一、RAG(Retrieval-Augmented Generation) 1. 核心原理 …...
6.QT-常用控件-QWidget|windowTitle|windowIcon|qrc机制|windowOpacity|cursor(C++)
windowTitle API说明windowTitle()获取到控件的窗⼝标题.setWindowTitle(const QString& title)设置控件的窗⼝标题. 注意!上述设置操作针对不同的widget可能会有不同的⾏为. 如果是顶层widget(独⽴窗⼝),这个操作才会有效. 如果是⼦widget,这个操作⽆任何效果. 代码⽰例…...
Excel/WPS表格中图片链接转换成对应的实际图片
Excel 超链图变助手(点击下载可免费试用) 是一款将链接转换成实际图片,批量下载表格中所有图片的转换工具,无需安装,双击打开即可使用。 表格中链接如下图所示: 操作方法: 1、双击以下图标&a…...
PostgreSQL基础
一、PostgreSQL介绍 PostgreSQL是一个功能强大的 开源 的关系型数据库。底层基于C实现。 PostgreSQL的开源协议和Linux内核版本的开源协议是一样的。。BDS协议,这个协议基本和MIT开源协议一样,说人话,就是你可以对PostgreSQL进行一些封装&a…...
win11修改文件后缀名
一、问题描述 win11系统中,直接添加.py后缀后仍然是txt文本文件 二、处理方式: 点击上方三个小点点击“选项”按钮 点击“查看”取消“隐藏已知文件类型的扩展名”选项点击“应用” 此时,“.txt”文件后缀显示出来了。将txt删去,…...
