主要的学习教程是nvidia出的那个《cg教程,可编程实时权威指南》以及三本《GPU编程精粹》
个人能力有限,只能尽量将自己理解的关键点记录下来,有想认真深入的朋友,建议完整的看一遍以上书籍
学习cg语言的主要目的是为了学习unity3d中shader的编写,以及以后可能做opengl,opencv的开发
官方的docment是用c++写opengl接口的程序,然后调用cg语言的.cg 文件来访问gpu硬件,我不会写c++,只好把所有工作都放到unity3d的环境中了,其中有些差异,但不大,主要是unity3d应用程序已经将顶点,法线等信息处理好了,封装了不少使用的东西在它的UNITY.cgnic文件中
一.gpu的发展历史
第一代第二代没有可编程能力,固定管线
第三代支持顶点编程(vertex)
第四代(即现今我们使用的)拥有可编程能力,使得顶点变换和像素操作从cpu转移到gpu中进行
二.gpu的渲染流程
在GPU渲染流水线的不同阶段,需要处理的对象分别是顶点(vertex)、几何图元(primitive)、片元(fragment)、像素(pixel)
顶点变换:将3d application中给定的顶点位置等,变换屏幕位置以便光栅器使用
图元处理:图元装配和光栅化,图元装配即是将顶点装配为几何图元,光栅化决定那些像素被图元覆盖,然后是插值贴图和着色
光栅操作:对片段进行操作(fragment)
三.vertex fragment
结构体:个人理解,用于定义输入输出结构,并绑定语义词,结尾有;,忘记输入;会报错
struct VertexIn{
position:POSITION;
normal:NORMAL;
textoord:TEXTOORD0;
};
语义词:全部大写,书中说是一种粘合剂,把cg程序和图形流水线的其他部分绑定在一起,指明该变量的硬件资源
POSITION
NORMAL
TEXTOORD0
COLOR
等等。。。。。
profile:cg程序用何种接口编译你的cg程序,各种profile对应不同的编程接口及不同能力的gpu硬件
opengl:
direct:
四.顶点 片段的流程和一些解释
变量
uniform修饰词,表示这是一个由外部程序提供的变量
普通变量的声明:type name = value;
例:float4 color = float4(1,1,1,1);
支持的类型:float,half,fixed三种浮点数类型的范围和大小不一样,分别是32bit,16bit,11bit
纹理(texture)
sampler1D
sampler2D
sampler3D
samplerCUBE
samplerRECT