织梦CMS - 轻松建站从此开始!

罗索

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

罗索客 发布于 2010-05-07 12:56 点击:次 
初学CG编程的人对入口函数的参数传递一定是很迷惑的,你不知这知参数的值从那里来,最终又不知它用到那里去。OK,我们可以这样大体地理解入口函数的参数:就像C++中的引用参数,每个参数都是外部环境中某一实体变量的别名。
TAG:

 一、CG程序入口

就像C语言中的 main()   以及 Window程序中的WinMain() 一样CG程序也有他的入口。

入口名字是任意的,如下面的cgMain()

  1. struct OutPut{  
  2. float4 pos:POSITION;      
  3. float4 color : COLOR;  
  4. };OutPut  
  5. cgMain(float4 posi)//cgMain就是CG的程序入口  
  6. {  
  7.     OutPut OUT;  
  8.     OUT.pos = posi;  
  9.     OUT.color = float4(0.0,1.0,0.0,1.0);  
  10.     return OUT;  

只要在CreateProgram中加入这个名字作参数就可以了

  1. CGcontext ctx = cgCreateContext();  
  2. CGprogram prog = cgCreateProgram(ctx,  
  3. CG_SOURCE,  
  4. mysourcepointer,  
  5. CG_PROFILE_ARBVP1,  
  6. "cgMain",  
  7. NULL); 

但默认的入口名是main();

二、CG----的参数传弟方式

CG的参数传弟方式。

     初学CG编程的人对入口函数的参数传递一定是很迷惑的,你不知这知参数的值从那里来,最终又不知它用到那里去。

OK,我们可以这样大体地理解入口函数的参数:就像C++中的引用参数,每个参数都是外部环境中某一实体变量的别名。

看看下面这一个CG着色器代码:

  1. void C6E3v_particle(float4 pInitial : POSITION,  
  2.                  float  tInitial : TEXCOORD0,  
  3.         //语义型输入参数  
  4.                  float4 vInitial : TEXCOORD1,  
  5.                  out float4 oPosition : POSITION,  
  6.                  out float3 color     : COLOR,  
  7.         //语义型输出参数  
  8.                  out float  pointSize : PSIZE,  
  9.                  uniform float    time,  
  10.                  uniform float4   acceleration,  
  11.         //uniform输入参数  
  12.                  uniform float4x4 modelViewProj)  
  13. {  
  14.   float t = time - tInitial;  
  15.   float4 pFinal = pInitial +vInitial * t + 0.5 * acceleration * t * t;  
  16.   oPosition = mul(modelViewProj, pFinal);  
  17.   color = float3(t, t, t);  
  18.   pointSize = -8.0 * t * t + 8.0 * t + 0.1 * pFinal.y + 1;  
  19.   if (pointSize < 0)  
  20.     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与显卡之间的数据交换就更多了。

 www.physdev.com

三、在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.rosoo.net/a/201005/9354.html]
本文出处:CSDN博客 作者:秩名
顶一下
(2)
100%
踩一下
(0)
0%
------分隔线----------------------------
相关文章
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容