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

该篇博客是我自己在学习Shader时,看《GPU编程与CG语言之阳春白雪下里巴人
》Cg语言概述这章,觉得有些东西自己记不住,因此记录下来。

Cg ToolKit下载地址: NVIDIA 的http://developer.nvidia.com/object/cg_toolkit.html 网页
下载之后直接安装即可。在安装目录的 bin 目录下一个可执行程序: cgc.exe 。这是 NVIDIA 提供的 Cg 程序编译器。

Cg编译
如果 Cg Toolkit 安装正确,在 NVIDIA Corporation\Cg\bin 文件夹下会看到
cgc.exe 文件。首先打开命令行窗口,输入 “cgc –h” (引号不用输入),如果安装
正确,则会出现下图所示的提示信息这里写图片描述

Cg 程序编译的命令形式为:

cgc [options] file

[options]表示可选配置项,file 表示 Cg 程序文件名。可选配置项包括编译时选择使用的 profile、着色程序的入口函数名称,以及着色程序文件名。比较典型的编译方式是:

cgc –profile glslv –entry main_v test.cg

-profile是profile配置项名;glslv是当前所使用的profile名称;-entry着色程序的入口函数名称配置项;main_v 是顶点着色程序的入口函数名;test.cg 是当前的着色程序文件名。编译器指定的着色程序入口函数名默认为main,通常为了将顶点\片段着色程序入口函数名区别开来,而并不使用默认名称。在下面所有的例子中,main_v 表示顶点着色程序入口函数名,main_f 表示片段着色程序入口函数名

以下是几点需要特别注意:
1. 着色程序分为顶点着色程序和片段着色程序, profile 也分为顶点 profile 和片段 profile ,所以编译顶点着色程序时必须选用当前图形硬件支持的顶点profile ,同理,编译片段着色程序时必须选用当前图形硬件支持的片段profile 。下面所示使用片段 profile fp20 编译顶点着色程序是不对的。

cgc –profile fp20 glslv –entry main_v test.cg

所以,如果您的着色程序中同时存在顶点着色程序和片段着色程序,在编译前切记分别选择各自的 profile 。
2. 选择 profile 如果不被当前图形硬件所支持,编译时会出现错误。被编译的着色程序中,如果存在不被所选择的 profile 所支持的语句,则编译时会出现错误。例如, tex2D(sampler2D tex , float3 sz ,float2 dsdx , float2 dsdy ) 不被 fp20所支持,如果你的编译形式为:

cgc –profile fp20 –entry main_f test.cg

则会出现错误提示信息:

error C3004: function “tex2D” not supported in this profile 。

改用 fp30 ,进行编译就会通过。

cgc –profile fp30 –entry main_f test.cg

尤其需要注意的是,循环语句 for,while 只被 vs_2_x, vp30, vp40,fp40 等少量的profiles 所支持。在其他的 profiles 中, for 和 while 循环只有当确切的知道循环次数时才能被使用 。但经过试验,通常在其他 profiles 编译含义 for,while 语句时会出现错误提示信息:

error c6003 : instruction limit of exceeded……

因此,如果没有确切的把握,不要在低级的 profiles 中使用循环控制语句。
3. 被编译的着色程序文件名必须加上 .cg 后缀。如果没有加后缀,写成如下的
形式:

cgc –profile glslv –entry main_v

则会出现错误提示信息:

fatal error C9999: Can’t open file:test

4.另外 cgc 还提供一种比较特殊的功能:就是将 Cg 语言所写的着色程序转换为使用 GLSL 或 HLSL 所编写的程序。例如,将代码写成如下形式,表示编译文件 test.cg 中的顶点着色程序,入口函数名为 main_v ,并将顶点着色程序转换为 glsl 程序,然后保存成文件 direct.glsl 。

cgc –profile glslv –o direct.glsl –entry main_v test.cg

5.还有一个非常隐蔽的编译情况是:如果着色程序中的某些变量并没有为最终的输出做出贡献,则编译时会将该部分代码忽略(会检查语法错误,但并不编译成汇编代码)。通常这一点不会造成太大的影响,但是如果这些变量刚是从外部宿主程序中传入的变量,并且在着色程序中没有被使用,则宿主程序传入变量的接口函数可能会报错 “ 找不到该变量 ” 。这种情况比较少遇到,但并非不存在,且一旦遇上问题的原因难以查明,故而我在此写上,希望可以有所帮助。

写在最后,由于我自己经常使用Mac开发,但在英伟达官网上下载的mac版本并不能正常安装,各种百度,谷姐都找不到问题,愁死人了,最后我决定先用Window系统,等我再搞搞Mac看是什么问题。

附一张mac上Cg ToolKit安装路径
这里写图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值