一、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;
  11. }

只要在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;
  21. }

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

一、CG程序入口

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

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

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

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

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

CG的参数传弟方式。

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

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

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

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

下面你就可以对CG代码进行编译了。

 四、关于如何一次性把CG编译器集成到VC6.0中。

上面文章提到如何在VC6.0中编译CG文件,上面的方法是可行的,但每个工程都要设置一次,有点麻烦。按下图的方法设定一下,就 可以一劳永逸了。
打开VC菜单:“Tool” ->"Customize..."
分别按下图添加一个CG顶点编译工具,和一个片段编译工具

编译的时候,就用TOOL中的CG *** Compile 来编译CG文件就可以了。

有一点值点注意的是:参数-entry ,指的是CG程序入口,默认是main,你可根据自己的情况作相应的修改。

http://w57w57w57.blog.163.com/blog/static/960747352009522991585/

[转]CG编程概念 ,及CG编译器与VC6.0集成方法相关推荐

  1. Cg编程入门编(OpenGL)

    Cg编程入门编(OpenGL) 原注:B Alex D'Angelo (alexz@FusionIndustries.com) 译: 华文广   未经本人同意,不能用于商业出版用途. 本文将介绍如何在 ...

  2. 【GPU编程】The Cg Runtime:OpenGL中调用Cg程序

    原文:<The Cg Tutorial>(Cg手册):Appendix B:The Cg Runtime,Page195 很多地方可能翻译得不好,还请大家见谅.指教! 注意:我省略了其中的 ...

  3. 【GPU编程】开始Cg之旅,编译自己的第一个Cg程序

    Cg(C for Graphcis)语言,是NVIDIA 与Microsoft 合作研发,旨在为开发人员提供一套方便.跨平台(良好的兼容性),控制可编程图形硬件的高级语言.Cg 语言的语法结构与C 语 ...

  4. Blender+PS三维辅助CG场景概念设计学习教程

    本教程涵盖:参考资料收集,素描,建立了一个在Blender的3D Kitbash设置,在Blender中封锁现场,并在Photoshop中绘制图像1和图像2.我还包括了一个我如何使用Blender的技 ...

  5. Rust常用编程概念之变量和可变性

    Time: 20190921 基本编程概念 Rust的学习曲线相对陡峭,更好的学习方式是先把概念理清楚,形成相对宏观的认知后,再动手实践,和一般的语言学习方式略有不同. 具体说就是,会涉及到Rust语 ...

  6. 【正点原子Linux连载】第一章 应用编程概念-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  7. Rust学习入门(2):Rust通用的编程概念

    文章目录 通用的编程概念 变量与可变性 数据类型 标量类型 复合类型 函数和注释 控制流(if else) 控制流 (循环) 参考链接 通用的编程概念 变量与可变性 声明变量使用let关键字,默认情况 ...

  8. 如何区别cg原画和cg插画?

    如何区别cg原画和cg插画?很多新手小白常搞不清楚cg原画和cg插画,会把两者混为一谈.其实这两者之间有挺大的区别,到底有什么区别呢?今天奇天CG学院小编就给大家科普一下吧. 从发展前景上看: 就两者 ...

  9. 面向对象编程概念_如何向6岁的孩子解释面向对象的编程概念

    面向对象编程概念 by Alexander Petkov 通过亚历山大·佩特科夫(Alexander Petkov) Have you noticed how the same cliche ques ...

  10. 机器学习速成课程 | 练习 | Google Development——编程练习:TensorFlow 编程概念

    TensorFlow 编程概念 学习目标: 学习 TensorFlow 编程模型的基础知识,重点了解以下概念: 张量 指令 图 会话 构建一个简单的 TensorFlow 程序,使用该程序绘制一个默认 ...

最新文章

  1. 基于Pytorch再次解析AlexNet现代卷积神经网络
  2. Hutool Java 工具类库导出 Excel,超级简单!
  3. 抽象工厂模式解析例子
  4. java模拟单链表环形链表解决约瑟夫问题
  5. Kafka学习 之 第一个例子(一)
  6. android log显示
  7. HandlerAdapter解析参数过程之HandlerMethodArgumentResolver
  8. (JS-PHP)使用RSA算法进行加密通讯
  9. SSIS - 7.发邮件任务
  10. java dump可视化在线内存分析工具
  11. JavaScript特效——让文字每秒钟进行变色
  12. eterm协议指令解析
  13. 如何进行网站挂马检测?怎样清除挂马?
  14. 乒乓球十一分制比赛规则_乒乓球比赛规则完整版
  15. 学了python能找人吗_只学python能找工作吗
  16. 欧拉系统搭建k8s网络
  17. USV(Unmanned Surface Vessels)研究概况和发展趋势
  18. logback-spring.xml配置详解
  19. VSCode更新到1.42.1版本有问题(January 2020 (version 1.42))
  20. 【THUSC2017】【LOJ2977】巧克力 斯坦纳树

热门文章

  1. 华为PIM-SSM配置实例
  2. MySQL 第六次练习(视图)
  3. Leetcode 刷题笔记(二十五) ——动态规划篇之背包问题:完全背包
  4. 搭建dubbo客户端
  5. Erlang中的OTP简要
  6. 黑马程序员-JavaAPI-17天-4(Arrays)
  7. java开辟_仿照百度文库_FlexPaper
  8. Nginx+FastCGI+Python
  9. 【笔记】Yale博弈论第一课
  10. 在mybatis里面设置不同数据库运行环境和适应性问题