|
|

楼主 |
发表于 2005-10-29 17:29:00
|
显示全部楼层
Re: CG入门学习日记篇
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); |
|