NVIDIA cg语言编写shader的学习笔记

时间:2021-03-28 20:27:27

主要的学习教程是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)

NVIDIA cg语言编写shader的学习笔记

顶点变换:将3d application中给定的顶点位置等,变换屏幕位置以便光栅器使用

图元处理:图元装配和光栅化,图元装配即是将顶点装配为几何图元,光栅化决定那些像素被图元覆盖,然后是插值贴图和着色

光栅操作:对片段进行操作(fragment)

NVIDIA cg语言编写shader的学习笔记






三.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