Shader学习之Cg语言二(Cg数据类型)
由于在用Cg语言写代码的时候,没有好用的编辑器,也不可以像Java,C++,C#这类语言的断点调试,所有逻辑需要写得很小心,变量名字也需要自己全部记住,相当于在文本编辑器上写代码,这样一些数据类型名称很容易写错,因此我记录下来,当自己忘记后方便查找。
Cg基本数据类型
Cg 支持 7 种基本的数据类型:
1. float : 32 位浮点数据,一个符号位。浮点数据类型被所有的 profile 支持(但是 DirectX8 pixel profiles 在一些操作中降低了浮点数的精度和范围);
2. half : 16 为浮点数据;
3. int : 32 位整形数据,有些 profile 会将 int 类型作为 float 类型使用;
4. fixed : 12 位定点数,被所有的 fragment profiles 所支持;
5. bool: 布尔数据,通常用于 if 和条件操作符( ?: ),布尔数据类型被所有的profiles 支持;
6. sampler* :纹理对象的句柄( the handle to a texture object ),分为 6 类:sampler, sampler1D, sampler2D, sampler3D, samplerCUBE, 和 samplerRECT 。DirectX profiles 不支持 samplerRECT 类型,除此之外这些类型被所有的 pixelprofiles和 NV40 vertex program profile 所支持。
7. string :字符类型,该类型不被当前存在的 profile 所支持,实际上也没有必要在 Cg 程序中用到字符类型,但是你可以通过 Cg runtime API 声明该类型变量,并赋值;因此,该类型变量可以保存 Cg 文件的信息。
除了上面的基本数据类型外, Cg还提供了内置的向量数据类型 (built-in vector data types) ,内置的向量数据类型基于基础数据类型。例如:float4,表示 float 类型的 4 元向量;bool4,表示 bool类型 4 元向量。
注意:向量最长不能超过 4 元,即在 Cg 程序中可以声明 float1 、 float2 、float3 、float4 类型的数组变量,但是不能声明超过 4 元的向量,例如:
float5 array;//编译报错
向量初始化方式一般为:
float4 array = float4(1.0, 2.0, 3.0, 4.0);
较长的向量还可以通过较短的向量进行构建:
float2 a = float2(1.0, 1.0);
float4 b = float4(a, 0.0, 0.0);
此外, Cg 还提供矩阵数据类型,不过最大的维数不能超过 4*4 阶。例如:
float1x1 matrix1;//等价于 float matirx1; x 是字符,并不是乘号!
float2x3 matrix2;// 表示 2*3 阶矩阵,包含 6 个 float 类型数据
float4x2 matrix3;// 表示 4*2 阶矩阵,包含 8 个 float 类型数据
float4x4 matrix4;//表示 4*4 阶矩阵,这是最大的维数
矩阵
的初始化方式为:
float2x3 matrix5 = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0};
注意: Cg 中向量、矩阵与数组是完全不同,向量和矩阵是内置的数据类型(矩阵基于向量),而数组则是一种数据结构,不是内置数据类型!这一点和C\C++ 中不太一样,在 C\C++ 中,这三者同属于数据结构,数组可以构建向量和矩阵。
Cg数组类型
在着色程序中,数组通常的使用目的是:作为从外部应用程序传入大量参数到 Cg 的顶点程序中的形参接口,例如与皮肤形变相关的矩阵数组,或者光照参数数组等。简而言之,数组数据类型在 Cg 程序中的作用是:作为函数的形参,用于大量数据的转递。
Cg 中声明数组变量的方式和 C 语言类似:例如:
float a[10];//声明了一个数组,包含 10 个 float 类型数据
float4 b[10];//声明了一个数组,包含 10 个 float4 类型向量数据
对数组进行初始化的方式为:
float a[4] = {1.0, 2.0, 3.0, 4.0}; //初始化一个数组
要获取数组长度,可以调用“ .length ”,例如:
float a[10]; //声明一个数组
int length = 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 阶矩阵数据。 float4x4 M[4] ,表示一个数组,包含 4 个 4 阶矩阵数据。进行数组变量声明时,一定要指定数组长度,除非是作为函数参数而声明的形参数组。并且在当前的 profiles 中,数组的长度和所引用的数组元素的地址必须在编译时就知道。
Cg结构类型
Cg 语言支持结构体( structure ),实际上 Cg 中的结构体的声明、使用和 C++非常类似(只是类似,不是相同)。一个结构体相当于一种数据类型,可以定义该类型的变量。引入结构体机制,赋予了 Cg 语言一丝面向对象的色彩。不过目前的 Cg 语言中的结构体以展现 “ 封装 ” 功能为主,并不支持继承机制。
结构体的声明以关键字 struct 开始,然后紧跟结构体的名字,接下来是一个大括号,并以分号结尾(不要忘了分号)。大括号中是结构体的定义,分为两大类:成员变量和成员函数。例如,定义一个名为 myAdd 的结构体,包含一个成员变量,和一个执行相加功能的成员函数,然后声明一个该结构体类型的变量,
代码为:
struct myAdd
{float val;float add(float x){return val + x;}
};
myAdd s;
使用符号“ • ”引用结构体中的成员变量和成员函数。例如:
float a = s.value;
float b = s.add(a);
注意:在当前的所有的 profile 版本下,如果结构体的一个成员函数使用了成员变量,则该成员变量要声明在前。此外,成员函数是否可以重载依赖于使用的 profile 版本一般来说 ,Cg 的源代码都会在文件首部定义二个结构体,分别用于定义输人和输出的类型,这二个结构体定义与普通的 C 结构定义不同,除了定义结构体成员的数据类型外,还定义了该成员的绑定语义类型 ( Binding Semantics) ,所谓绑定语义类型是为了与宿主环境进行数据交换的时候识别不同数据类型的。目前Cg 支持的绑定语义类型包括 POSTION(位置) , COLOR( 颜色 ) , NORMAL( 法向量 ) , Texcoord( 纹理坐标 ) 等类型。当顶点着色程序向片段着色程序传递的数据类型较多的情况下,使用结构体可以大大的方便代码的编写和维护。
Cg类型转换
Cg 中的类型转换和 C 语言中的类型转换很类似。 C 语言中类型转换可以是强制类型转换,也可以是隐式转换,如果是后者,则数据类型从低精度向高精度转换。在 Cg 语言中也是如此。例如:
float a = 1.0;
half b = 2.0;
float c = a+b; //等价于 float c = a + (float)b;
当有类型变量和无类型常量数据进行运算时,该常量数据不做类型转换,举
例如下:
float a = 1.0;
float b = a + 2.0; //2.0 为无类型常量数据,编译时作为 float 类型
Cg 语言中对于常量数据可以加上类型后缀,表示该数据的类型,例如:
float a = 1.0;
float b = a + 2.0h; //2.0h 为 half 类型常量数据,运算是需要做类型转换
常量的类型后缀( type suffix )有 3 种:
f :表示 float;
h:表示 half;
x:表示 fixed
Shader学习之Cg语言二(Cg数据类型)相关推荐
- 如何学习C语言,超详细的经验分享(学习笔记1--C语言的基本数据类型)
前言: 如果你正在学习C语言而又不知道从何处开始学,你可以跟着我一起学习C语言,在寒假期间我每天都会发一篇博客,里面有各种C语言的知识点,如果你想学习下去,想进步,就来每天跟着我一起打卡吧,期待我们能 ...
- 初识C语言 二(数据类型、变量和常量)
文章目录 1.数据类型 2.变量和常量 2.1变量 2.1.1定义变量的方法 2.1.2变量的分类 2.1.3变量的使用 2.1.4变量的作用域和生命周期 2.2常量 2.2.1字面常量 2.2.2c ...
- Shader编程学习笔记(九)—— Cg语言入门1 - 输入输出和语义
Cg入门一:输入输出和语义 本小节对Cg语言进行一个入门了解. 在以前的课程中,我们了解了渲染管线.顶点和片段程序和颜色计算等,在本小结中来了解一个简单的shader的顶点和片段程序的输入输出以及常用 ...
- Shader学习之Cg语言一(Cg语言概述)
该篇博客是我自己在学习Shader时,看<GPU编程与CG语言之阳春白雪下里巴人 >Cg语言概述这章,觉得有些东西自己记不住,因此记录下来. Cg ToolKit下载地址: NVIDIA ...
- Shader学习之Cg语言三(Cg表达式与控制语句)
Cg中的操作符与C语言中很类似,所以下面我就只是记录操作符对应的符号,细节和用法看着符号就会了. 关系操作符:<,<=,!=,==,>=,> 逻辑操作符:&&, ...
- Shader CG语言
Shader介绍 Shader是可编程图形管线的算法片段,它主要分为两类,Vertex Shader和Fragment Shader. 圣典shader总目录(在最下方) vs自动补全代码,语法高亮显 ...
- Cg语言学习笔记(1)
最近在学习Unity3d Shader编程,Unity3d Shader使用的是Cg语言,网上找了一下Cg的教程,发现<Cg教程-可编程实时图形权威指南>不错,在学习此书的过程中记录一下笔 ...
- Java学习笔记二:数据类型
Java学习笔记二:数据类型 1. 整型:没有小数部分,允许为负数,Java整型分4种:int short long byte 1.1 Int最为常用,一个Int类型变量在内存中占用4个字节,取值范围 ...
- 《Go语言圣经》学习笔记 第四章 复合数据类型
<Go语言圣经>学习笔记 第四章 复合数据类型 目录 数组 Slice Map 结构体 JSON 文本和HTML模板 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. ...
最新文章
- c语言头文件中定义inline static相关函数的优劣
- .net的mvc的fw版本为4.5发布到阿里云【云虚拟主机】上.
- 菜鸟成长之路05/06/07
- 软件构建之链接应用--链接脚本
- bzoj千题计划197:bzoj4247: 挂饰
- 38.C++修饰构造函数的explicit关键字
- react循环setstate_[React] 8 - React 自身或工程性能优化点?
- flutter显示图标_如何让 Flutter 应用更好地使用 SVG?
- ASP.NET Core中实现单体程序的事件发布/订阅 - LamondLu - 博客园
- electron打包
- 如何跳过或去除“非正版Windows系统“信息
- 广二师的计算机专业好不,广东技术师范学院和广东第二师范学院哪一个更好?...
- JavaScript实现 页面滚动图片加载
- java 分布式任务队列_cerely-分布式异步任务队列
- 更改数据库表中有数据的字段类型NUMERIC(18,2)为NUMERIC(18,6)
- Ubuntu在docker容器中安装TensorFlow-1.5
- jflash烧录教程_Jflash烧录(windows)原理分析
- keil(MDK) 5官方下载教程
- 【字节跳动】数据分析师面经
- 【matlab图像处理】图像处理的经典操作