游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8682|回复: 13

CG入门学习日记篇

[复制链接]

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2005-10-29 17:24:00 | 显示全部楼层 |阅读模式
一、CG学习日记----CG程序入口
就像C语言中的 main()   以及 Window程序中的WinMain() 一样CG程序也有他的入口。

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

  1. struct OutPut{        float4 pos: POSITION;       
  2.         float4 color : COLOR;
  3.         };
  4. OutPut cgMain(float4 posi)                //cgMain就是CG的程序入口
  5. {       
  6. OutPut OUT;        OUT.pos = posi;       
  7. OUT.color = float4(0.0,1.0,0.0,1.0);        r
  8. eturn OUT;
  9. }
  10. ====================================================
  11. CGcontext ctx = cgCreateContext();   
  12. CGprogramprog=cgCreateProgram(ctx,  
  13.                                              CG_SOURCE,  
  14.                                      mysourcepointer,  
  15.                                      CG_PROFILE_ARBVP1,  
  16.                                              "cgMain",   
  17.                                      NULL);
复制代码


只要在CreateProgram中加入这个名字作参数就可以了
但默认的入口名是main();

******************************************************************************

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-10-29 17:28:00 | 显示全部楼层

Re: CG入门学习日记篇

CG学习日记----在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代码进行编译了。


**************************************************************************

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-10-29 17:29:00 | 显示全部楼层

Re: CG入门学习日记篇


CG学习日记----CG的参数传弟方式。

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

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

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


  1. void C6E3v_particle(float4 pInitial : POSITION,
  2.                  float  tInitial : TEXCOORD0,                //语义型输入参数
  3.                  float4 vInitial : TEXCOORD1,

  4.                  out float4 oPosition : POSITION,
  5.                  out float3 color     : COLOR,                //语义型输出参数
  6.                  out float  pointSize : PSIZE,

  7.                      uniform float    time,
  8.                      uniform float4   acceleration,                //uniform输入参数
  9.                      uniform float4x4 modelViewProj)
  10. {
  11.   float t = time - tInitial;
  12.   float4 pFinal = pInitial +vInitial * t + 0.5 * acceleration * t * t;

  13.   oPosition = mul(modelViewProj, pFinal);
  14.   
  15.   color = float3(t, t, t);

  16.   pointSize = -8.0 * t * t + 8.0 * t + 0.1 * pFinal.y + 1;
  17.   if (pointSize < 0)
  18.     pointSize = 0;
  19. }

复制代码

==============================================================
很明显地看到,入口变量中有三种不同类型的参数:语义型输入参数,语义型输出参数,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);

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-10-29 17:40:00 | 显示全部楼层

Re: CG入门学习日记篇

请支持!

我的blog
http://blog.gameres.com/show.asp?BlogID=1658&column=0

sf_20051029174027.doc

22.5 KB, 下载次数:

0

主题

6

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2005-10-30 20:34:00 | 显示全部楼层

Re:CG入门学习日记篇

先顶一下了,虽然喔的集成显卡不支持cg

8

主题

239

帖子

239

积分

中级会员

Rank: 3Rank: 3

积分
239
发表于 2005-10-31 10:33:00 | 显示全部楼层

Re:CG入门学习日记篇

根顶,我得不支持ps。

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
 楼主| 发表于 2005-11-1 15:36:00 | 显示全部楼层

Re: CG入门学习日记篇

VC6.0 的OpenGL CG Wizard工程向导

copy to:
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Template

sf_2005111153558.rar

183.34 KB, 下载次数:

0

主题

15

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2005-12-4 21:25:00 | 显示全部楼层

Re:CG入门学习日记篇

不懂

1

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-1-4 12:23:00 | 显示全部楼层

Re:CG入门学习日记篇

支持楼住!!

55

主题

331

帖子

337

积分

中级会员

Rank: 3Rank: 3

积分
337
发表于 2006-1-10 23:17:00 | 显示全部楼层

Re:CG入门学习日记篇

UP...................
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 22:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表