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

上文中介绍了Shader相关基础概念,想了解的读者可通过ShaderLab开发实战——Shader基本概念查看。

文章最后还剩一个问题没有介绍,就是Shader编程语言Cg(C for graphics),本文将介绍Cg的相关知识点。

本文主要介绍两个问题,第一,为什么要使用Cg开发Shader,第二,Cg语言入门知识和学习资料。

1. 为什么要使用Cg开发Shader

    在Shader基本概念文章中已经介绍了,目前Shader的实现语言一共有三种,微软提供的HLSL(High Level Shading Language),OpenGL提供的GLSL(OpenGL Shading Language)以及NIVIDIA联合提供的Cg(C for graphics)。在Cg出现之前,HLSL和GLSL占据了整个Shader开发市场。随着NIVIDIA的GeForce系列显卡的崛起,其推出的Cg语言取得了巨大的成功。Cg语言是可以被OpenGL和DirectX广泛支持的图形处理器编程语言,属于OpenGL和DirectX的上层语言。可以说使用Cg编程的Shader可以在OpenGL和DirectX环境上运行,良好的跨平台性给开发者提供较大便利。另外Cg语言的易学性也是其一大优势,设计者的初衷也是想将Shader编程想C语言一样方便,当然还有一个重要原因是Unity3D中ShaderLab的编写使用了Cg语言。基于以上原因,Cg语言不断受到Shader开发者的青睐,学好Cg语言也是Shader编写的关键。

2. Cg语言入门知识和学习资料

    这里首先介绍一下Cg语言的编译过程。任何的汇编语言或高级语言程序都需要经过编译程序翻译成计算机能够理解0、1序列,整个编译过程分为静态编译和动态编译,两者的却别在于编译成可执行文件后是否需要源码信息。静态编译是指一旦语言编译成可执行文件,可执行文件运行中就不再需要源码信息,动态编译则相反。Cg语言的编译通常使用的是动态编译,当然也支持静态编译,NIVIDIA提供的Cg语言编译程序为cgc.exe。

    cgc首先会将Cg程序翻译成可被图形API(OpenGL和Direct3D)支持的形式,然后应用程序使用适当的OpenGL和Direct3D命令将翻译后的Cg程序传递给图形处理器,OpenGL和Direct3D的驱动程序最终会把它翻译成图形处理器所需要的硬件可执行格式。

   之后本文将从Cg语言数据类型开始讲起,介绍Cg语言相关入门知识。

    1. Cg数据类型

        Cg中支持六种基本数据类型,分别为float、int、half、fixed、sampler*、bool

        其中float和half分别为32位和16位的浮点数,int和fixed分别为32位整形和12定点数,sampler*为纹理对象,包括sampler2D、sampler3D、samplerRECT以及sampler CUBE等。

        除了基本数据类型,Cg还提供了内置的向量数据类型以及矩阵数据类型

        向量数据类型如float4表示float类型的4元向量,fixed4表示fixed类型的4元向量,这里注意的是向量长度不能超过4元。

        矩阵数据类型如float4x4表示4*4阶矩阵,4*4是矩阵的最大维度。

        在Cg语言中,向量和矩阵为内置的数据类型,而下面要说的数组则是一种数据结构。

        这里顺便提一下数据结构和数据类型的区别,数据类型是指数据的一种分类,比如说变量为Int或者float类型等。而数据结构是相互之间存在一种或者多种关系的数据的集合,比如数组结构将同一数据类型的变量储存在一起,那么数组就叫做数据结构。

        Cg中通过float a[10]声明一个包含10个float数据类型元素的数组,可以通过a.length获得数组长度

        Cg支持结构体类型,一个结构体相当于一种数据类型,可以定义该类型的变量。结构体生命一strcut开始,紧跟着结构体变量名以及大括号和分号等。

        Cg语言支持强制类型转换和隐式转换。当有类型变量和无类型常量进行运算时,无类型常量不进行类型转换。例如float a=1.0;float b = a+2.0此时2.0不换类型转换,编译时作为float类型。

        可在常量后面加上类型后缀,此时运算需要类型转换,后缀f表示float,h表示half,x表示fixed。

    2.Cg语言表达式与控制语句

        Cg中的操作符和c语言相似,这里就不进行过多说明了,附图:

214304_mLfY_3227483.png

214357_wRTH_3227483.png

           此外Cg中还支持了数学操作符、位移操作符、wizzle操作符(".")以及条件操作符。操作符的优先顺序如图:

    091244_N5Mr_3227483.png

        在控制流语句中,支持条件语句包括if、if-else,循环语句包括while、for、break以及return。

    3.输入\输出和语义绑定

        Cg中不存在指针的概念,所有数据通常都是暂存在寄存器中。

        Cg中s的关键字很多都是照搬C\C++中的关键字。

        in、out、inout用来表示函数输入参数的传递方式。这里先提一下形参和实参的区别,形参是指定义函数名和函数体时使用的参数,目的是接收调入参数时传入的参数;实参是指调用函数时,传入的参数。参数的传递分为值传递和引用传递,值传递时,函数处理的是传入实参的拷贝,不会影响实参的原值;引用传递时,函数处理的是实参的地址(C\C++使用指针,CG中使用in、out、inout关键字),会影响原有实参的值。in修饰形参,表示形参只用于输入,典型的值传递。out修饰形参,表示形参只用于函数的输出,也可以用return代替out修饰符使用。inout修饰形参,表示形参即用于输入也用于输出,典型的引用传递。

         const和uniform是独立的,可同时使用也可单独使用。

        uniform用来修饰只能由外部应用程序传入的变量。在Cg中输入的数据流分为两类:第一类Varying inputs表示输入数据流中图元信息的各种组成要素,包括顶点位置、法向量以及纹理坐标数据等。第二类Uniform数据由外部应用程序初始化并传入,不会随着图元信息的变化而变化。

        const用来修饰变量为常量变量。表示const修饰的变量初始化之后,其值不会改变。     

        语义词是数据和寄存器做一个映射关系,是两个处理阶段(顶点程序、片段程序)之间的输入\输出数据和寄存器之间的桥梁,同时语义通常也表示数据的含义,如 POSITION一般表示参数种存放的数据是顶点位置。   语义分为输入语句和输出语句:

        顶点着色程序的输入语义:

        POSITION:四元向量,最后一元数据为1,表示模型空间内的顶点位置坐标,在OpenGL中对应接收应用程序传递顶点数据的寄存器上。

        NORMAL:四元向量,最后一元数据为0,表示模型空间中顶点法向量坐标,在OpenGL中对应接收应用程序传递顶点法向量的寄存器上。

        顶点着色程序的输出语义及片段着色程序的输入语句:

        顶点着色程序的输出语义会被传入到片段着色程序中。

        语义包括POSITION、PSIZE、FOG、COLOR0-COLOR1,TEXCOORD0-TEXCOORD7。

        顶点着色程序中必须绑定一个输出语义POSITION,作为裁剪空间中的顶点坐标,该数据只被用于光栅化。

        为了保持顶点着色程序输出语义和片段着色程序输入语义的一致性,推荐使用struct类型数据作为两者之间的传递。例如:

105656_AYlJ_3227483.png

        这里值得注意的地方是,在顶点着色程序中,输入语义和输出语义中都包括一个POSITION语义。两者是不同的,前者是应用程序中模型空间中的顶点坐标,是用来顶点着色程序对顶点坐标进行处理的。后者是顶点着色程序输出的裁剪空间顶点坐标,是用来给片段程序做光栅化处理的。两者都为POSITION语义,但作用是不一样的。

        片段着色程序的输出语义

        片段着色程序的输出语义通常只有一个,COLOR作为该片段的最终颜色值。

        绑定语义方法

        常见的绑定语义方法有三种:

        1. 声明在函数形参列表后面。

131822_GqUA_3227483.png

        2. 声明在结构体成员变量后面。

   131925_ISXI_3227483.png

        3. 声明在函数声明后面。

132012_yhyo_3227483.png

    4.函数与程序设计

        Cg中函数的定义同C\C++中函数的定义方式一致,并且支持函数重载,即通过形参个数和类型进行函数区分。

        Cg中使用数组形参时传递的是数组的完整拷贝,C\C++中实际传入的是指向首元素的指针。数组作为函数形参时,可不必声明数组长度。如制定长度,调用函数传入实参数组时需要与函数形参数组长度一致。

        Cg中顶点处理程序和片段处理程序各提供了一个入口函数,同C\C++中的main()方法相似。通过判断函数输入、输出语义来判断入口函数。

        Cg中提供了一系列的内建的标准函数库,分为5个部分:数学函数、几何函数、纹理映射函数、偏导数函数以及调试函数。具体函数有哪些,读者可自行搜索。

    至此,Cg相关的基础知识已介绍完毕,可以看出Cg中的无论数据结构,函数语法都与C\C++很相似,建议学习中充分结合OpenGL渲染流程的实现原理。     

转载于:https://my.oschina.net/u/3227483/blog/1810747

来源:https://my.oschina.net/u/3227483/blog/1810747


智能推荐

计算机图形学笔记---Cg语言(一)

在其他的profiles中,for和while循环只有当知道确切循环次数时才能被使用;但其实没有确切把握不用在低级的profiles中使用 被编译的着色程序文件名必须加上.cg后缀 注意一个难以查明的编译情况:着色程序中某些变量没有为最终输出做出贡献,则编译会将该部分代码忽略;如果是从外部宿主程序中传入的变量,且在着色程序中没用,则宿主程序传入变量的接口函数会报错“找不到该变量&rdq...

TensorFlow实战(三)-简介和开发环境搭建

3-1 什么是tensorflow 官网首页 3-2 tensorflow和其他机器学习库的对比 3-3 如何学习tensorflow...

《树莓派开发实战(第2版)》——2.1 Figaro简介

本节书摘来异步社区《概率编程实战》一书中的第2章,第2.1节,作者:【美】Avi Pfeffer(艾维·费弗),更多章节内容可以访问云栖社区“异步社区”公众号查看。 2.1 Figaro简介 首先,我们对Figaro做一个概述。在第1章中已经介绍过,Figaro是一种概率推理系统。在查看其组件之前,我们先回顾概率推理系统的一般组件,使您可以和Figaro比较。...

iPhone开发系列文章(三)-Objective-C语言简介

本人翻译的Apple Dev Center的技术资料并稍作修改。 转载请注明出处:http://blog.csdn.net/zhyzh2046/ 学习Objective-C:初级读本 Objective-C是一种简单的计算机语言,支持复杂南通的面向对象编程。Objective-C从标准的ANSI C语言扩展而来,并提供了定义类、方法和属性的语法,还有其它结构来促进类的动态扩展。类的语法和设计把部分...

用C语言开发NES游戏(CC65) 简介

粘贴到CSDN格式没调,想看格式好的点下面 https://happysoul.github.io/nes/nesdoug/   简介: 作者nesdoug,作者重写了他的代码并发布到了github https://github.com/nesdoug 作者的目的是让所有的开发者尽量不去学习6502汇编,通过C语音就能开发出来NES游戏   作者的过时教程:https...

猜你喜欢

[Winodows Phone 7控件详解]绘图控件-2

二.Path:路径控件通过Markup Syntax来绘制一系列的线条或通过Geometries来绘制形状,这个控件是图形控件中最复杂的。 还可以使用Mini-Language为Data属性赋值,Mini-Language强大。 Mini-Language: 移动命令:   M:绝对起始点   m:相对前一点的起始点   如:M 100,200 直线命令:   L/l:直线的结束点   如:L10...

设置tomcat项目发布目录

2019独角兽企业重金招聘Python工程师标准>>> a、选择发布路径 b、设置超时时间   15秒内停止完成,如果没有停止完成,就可能会出现端口被占用,所以停止时间设置成300秒,让它完全停止 c、资源有变化时自动发布 d、切换到modules面板,勾掉auto,否则可能会导致每一个ctrl + s都会导致重新发布   e、设置发布内容,发现把web-co...

Android+app测试基础1+安装软件appium

最近在安装appium软件,发现好多问题,这里跟大家共勉 1: node ,通过官网去下载node,https://nodejs.org/zh-cn/,下载最新的版本node, 注意如果你改变了node的安装路径,需要去配置path,就是把你的安装路径放置进去, 在命令窗口,输入 node -v ,如果出现如下界面,说明node安装好, 2: 配置 sdk,注意sdk的版本号必须高17,SDk需要...

5个提升技能的数据工程项目

所有迹象都表明数据工程将蓬勃发展。 Dice发布的2020年科技工作报告将数据工程列为2020年增长最快的领域,增长幅度达到惊人的50%,而数据科学职位仅增长了10%。您可以放心,数据工程的发展势头不会很快消退。为支持这一假设,国际数据集团 (IDG) 预测,从2021年到2024年,数据使用量的五年复合增长率 (CAGR) 将超过过去 30 年的数据创建总量。 如果您仍然不相信数据工程的前景,那...

ireport设计报表

1.效果图           2.java、提供数据的后台代码 绑定多个数据源,list放到map中。   3.ireport设计的报表模板 建议copy下来保存为jrxml格式,然后用ireport4.6打开,可以看到柱状图,饼形图,table(多个,并分组),静态文本,动态文本,是如何设置的,其中绑定了四个数据源。   &...

问答精选

Makefile syntax: what is $(RM)?

I saw the following Makefile online (here): When there is a hello.c file in the same directory with the Makefile, make command in Terminal builds hello executable. When make clean is run, hello execut...

Bootstrap Navbar not working when Responsive CSS not used

I am using latest Bootstrap for designing my Admin panel. The Navbar I have included work fine when the Responsive css is include as below : But when I remove this line and reload the page, the Dropdo...

Iterate over first N rows in pandas

What is the suggested way to iterate over the rows in pandas like you would in a file? For example: I was thinking to do something like: Is there a built-in way to do this though in pandas? Hasn't any...

Is there a pre-made Continuous Integration solution for .NET applications?

From my perspective, we're constructing our own 'flavour' of NAnt/Ivy/CruiseControl.Net in-house and can't help but get the feeling that other dev shops are doing exactly the same work, but then every...

In Enyo, how do you remove a control you created?

One example, I have a refresh buttons I created that is displayed on top, could I have code to later on remove this control????? code with refresh button in it I would like to remove later on as the p...

相关问题

相关文章

热门文章

推荐文章

相关标签

推荐问答