文章内容源自《GPU编程与CG语言之阳春白雪下里巴人》,因笔者读书易中途放弃,遂每读一章节,将其移至简书平台,以此作为对自己读书的勉励。笔者用粗体、斜体 标注了关键词句,望感兴趣的读者们一起学习共勉。猛戳这里查看更多!
所谓入口函数,即一个程序执行的入口,例如 C\C++程序中的 main()函数。
通常高级语言程序中只有一个入口函数,不过由于着色程序分为顶点程序和片断程序,两者对应着图形流水线上的不同阶段,所以这两个程序都各有一个入口函数。
顶点程序和片段程序有且只有一个入口函数,当程序进行编译时,需要指定入口函数名称(参阅 4.4 节 CG 编译),除非入口函数名为 main
。当我们编写或阅读 Cg 代码时,如何区分哪个函数是入口函数呢?或者哪个入口函数对应着顶点程序或片段程序?事实上,顶点程序和片段程序的入口函数形式,已经完全由它们在渲染管线中所处的阶段所决定。在前面已经阐述过,顶点程序接收应用程序传递的顶点数据(通常位于模型坐标空间),然后进行坐标空间转换和光照处理,后输出投影坐标和计算得到的光照颜色;而片段程序接收从顶点程序输出的数据,并进行像素颜色计算。在片段程序中往往涉及到纹理颜色的处理,其输入参数中常有纹理形参的声明。所以通过观察程序的输入输出语义绑定(参阅 7.5 节语义词与语义绑定),就可以区分入口函数对应到顶点程序还是片段程序。而内部函数则忽略任何应用到形参上的语义,通常也没有人会在内部函数使用语义词,除非他\她的目的是练习打字速度。
下面的代码展示了一个顶点程序的入口函数,名称为 C2E1v_green
,这个顶点着色程序接收二维顶点数据,然后转换为齐次坐标(请思考,顶点和向量的齐次坐标有什么不同?齐次坐标的本质是什么?),并将该顶点设置为绿色,最后使用 return 语句输出。如果电脑安装了 Cg,该程序文件位于“NVIDIA Corporation\Cg\examples\OpenGL\basic\ 01_vertex_program\C2E1v_green.cg
”目录下。
struct C2E1v_Output {
float4 position : POSITION;
float3 color : COLOR;
};
C2E1v_Output C2E1v_green(float2 position : POSITION)
{
C2E1v_Output OUT;
OUT.position = float4(position,0,1);
OUT.color = float3(0,1,0);
return OUT;
}