CG编程入门----编程概念 ,及CG编译器与VC6.0集成方法

ZDNet软件频道时间2008-07-03作者:physdev | PhysDev论坛
本文关键词:编译器 CG GPU
一、CG程序入口 就像C语言中的 main() 以及 Window程序中的WinMain() 一样CG程序也有他的入口。 入口名字是任意的,如下面的CGMain()
代码:
 struct OutPut{   float4 pos:      POSITION;   float4 color : COLOR;};OutPut CGMain(float4 posi)//CGMain就是CG的程序入口{   OutPut OUT;   OUT.pos = posi;   OUT.color = float4(0.0,1.0,0.0,1.0);   return OUT;}   只要在CreateProgram中加入这个名字作参数就可以了   CGcontext ctx = CGCreateContext();   CGprogram prog = CGCreateProgram(ctx,                                    CG_SOURCE,                                    mysourcepointer,                                    CG_PROFILE_ARBVP1,                                    "CGMain",                                    NULL);  
但默认的入口名是main(); 二、CG----的参数传弟方式 CG的参数传弟方式。 初学CG编程的人对入口函数的参数传递一定是很迷惑的,你不知这知参数的值从那里来,最终又不知它用到那里去。 OK,我们可以这样大体地理解入口函数的参数:就像C++中的引用参数,每个参数都是外部环境中某一实体变量的别名。 看看下面这一个CG着色器代码:
代码:
void C6E3v_particle(float4 pInitial : POSITION,                 float  tInitial : TEXCOORD0,      //语义型输入参数                 float4 vInitial : TEXCOORD1,                  out float4 oPosition : POSITION,                 out float3 color     : COLOR,      //语义型输出参数                 out float  pointSize : PSIZE,                uniform float    time,                uniform float4   acceleration,      //uniform输入参数                uniform float4x4 modelViewProj){  float t = time - tInitial;  float4 pFinal = pInitial +vInitial * t + 0.5 * acceleration * t * t;  oPosition = mul(modelViewProj, pFinal);    color = float3(t, t, t);   pointSize = -8.0 * t * t + 8.0 * t + 0.1 * pFinal.y + 1;  if (pointSize < 0)    pointSize = 0;}
============================================================== 很明显地看到,入口变量中有三种不同类型的参数:语义型输入参数,语义型输出参数,uniform输入参数。首先我们来理解“语义”,这个词的真正含义,其实,更准确地说我们应该把它叫“绑定语义”(Binding Semantics),从Binding这个词我们就能想像得到,POSITION这个语义,它就是用来把pInitial 这个参数与外部环境(OpenGL)中的顶点位置向量绑在一起。输出语义也是这样的原理。 让我们来回答开始时提出的问题:从哪里来,到哪里处。 1、从哪里来。现在让我们假设,OpenGL在对顶点进行渲染之前,在程序中都自动生成了这样一个数据结构struct vertex; 这个数据结构包含了vertex.position, vertex.normal, vertex.color, vertex.texcoord.等等所有与顶点相关的状态信息。而这些信息都是公开的,能够被外部函数所引用。所以,CG中的语义型输入参数的值就是从这些信息中自动获取。如例子中的“float4 pInitial : POSITION”,通过POSITION这个绑定语义,把pInitial这个变量与vertex.position这个信息绑定在一起,于是pInitial就被赋值了。这是不是和C++中的引用一样的原理呢?注意:输入参数是只读的。 2、到哪里去?如果知道了从哪里来,那么到哪里去也很好理解,(out float3 color : COLOR),有个OUT在前面作修饰的参数就是语义型输出参数。这里通过COLOR这个绑定语义,把color向量与vertex.color这个值绑定在一起。在CG的代码中,经过一系列的运算和处理之后,最终得到顶点的新的颜色,把这个颜色值重新返回给OpenGL的顶点属性中,OpenGL再通过读取该属性对顶点进行渲染。 总的来说,语义型参数的输入与输出都是由CG自动完成,程序要做的只是把它与对应的语义绑定。 说了那么多,还有一个uniform输入参数,我们还没有说。如果说语义型参数是CG自动处理的,那么uniform型参数就是要程序员在程序中为它赋值的。在OpenGL程序中我们是这样实现的: 1、程序中声明一个静态指针变量 static CGprogram VertexColor = NULL; 2、把这个指针变量与CG入口的uniform输入参数绑定在一起。 VertexColor = CGGetNamedParameter(VertexProgram, "color"); 3、通过以下这个函数来对CG中的uniform输入参数进行赋值。 CGGLSetParameter3f(VertexColor, 0.0, 1.0, 0.0); 有些网友问有没有办法将参数传递出来,答案是有的,就是通过把参数作为一种纹理值传出来。这是一种深层次的应用,有兴趣的朋友可以研究一下,现在nVidia计划推出一种带物理引擎的显卡,如果是这样的话,CPU与显卡之间的数据交换就更多了。 [url] www.physdev.com[/url] 三、在VC6.0中编译CG代码及查错的方法 1、把*.CG文件加到你的工程中去。2、鼠标右键单击工作区中该CG文件名,在弹出菜单中选择setings..., 将会出现project settings对话框。3、选择Coustom Buid属性页,把下面一行复制到Commands文本框中:"$(CG_BIN_PATH)CGc.exe" "$(InputPath)" -profile arbvp1 -o out.vp 4、把下面一行复制到Outputs文本框中:$(OutDir) 下面你就可以对CG代码进行编译了。 //====================================== 四、关于如何一次性把CG编译器集成到VC6.0中。 上面文章提到如何在VC6.0中编译CG文件,上面的方法是可行的,但每个工程都要设置一次,有点麻烦。按下图的方法设定一下,就 可以一劳永逸了。打开VC菜单:“Tool” ->"Customize..." 分别按下图添加一个CG顶点编译工具,和一个片段编译工具。 编译的时候,用“Tool”中的CG *** Compile来编译CG文件就可以了。有一点值得注意的是:下图中的参数-entry,指的CG程序入口,默认入口名是main,如果的的CG入口名有所不同,请作相应的修改。


http://www.physdev.com/phpbb/files/CG_fragment_compile_tool_130.jpg
 描述:


http://www.physdev.com/phpbb/files/CG_vertex_compile_tool_161.jpg
 描述:


http://www.physdev.com/phpbb/files/gg_compile_tool_161.jpg
 描述:
您看到此篇文章时的感受是:
支持
愤怒
无聊
暴汗
养眼
炒作
不解
标题党
搞笑
用户评论
用户名
评论内容
发表时间
- 发表评论 -
匿名
注册用户

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134