OpenGL着色器程序解析--着色器基础

部分内容来源于https://yq.aliyun.com/articles/212816?spm=5176.100239.blogcont212814.16.7FHthK
现代OpenGL渲染管线严重依赖着色器来处理传入的数据。如果不使用着色器,那么用OpenGL可以做到的事情可能只有清除窗口内容了,可见着色器对于OpenGL的重要性。在OpenGL 3.0版本以前(含该版本),或者如果你用到了兼容模式(compatibility prof?ile)环境,OpenGL还包含一个固定功能管线(f?ixed-function pipeline),它可以在不使用着色器的情况下处理几何与像素数据。从3.1版本开始,固定功能管线从核心模式中去除,因此我们必须使用着色器来完成工作。
着色器类似一个函数调用的方式—数据传输进来,经过处理,然后再传输出去。例如,在C语言中,这一过程可以通过全局变量,或者函数参数来完成。GLSL与之稍有差异。每个着色器看起来都像是一个完整的C程序,它的输入点就是一个名为main()的函数。但与C不同的是,GLSL的main()函数没有任何参数,在某个着色阶段中输入和输出的所有数据都是通过着色器中的特殊全局变量来传递的(请不要将它们与应用程序中的全局变量相混淆—着色器变量与你在应用程序代码中声明的变量是完全不相干的)。
OpenGL定义了六类存储限定符(const/in/out/uniform/buffer/shared)。
OpenGL定义了in变量将数据拷贝到着色器中,以及out变量将着色器的内容拷贝出去。这些变量的值会在OpenGL每次执行着色器的时候更新。另一类变量是直接从OpenGL应用程序中接收数据的,称作uniform变量。uniform变量不会随着顶点或者片元的变化而变化,它对于所有的几何体图元的值都是一样的,除非应用程序对它进行了更新。buffer是在应用程序中共享一大块缓存给着色器,和uniform不同的是buffer允许着色器对其进行修改。
GLSL和C语言一样使用//或//进行注释,和c语言不一样的是所有变量都必须在声明的同时进行初始化。GLSL支持任意类型的数组,例如

float coeff[3]=float[3](2.38,3.14,42.0);

这里就简单讲解到这里,我们后面全部从代码出发进行解析

猜你喜欢

转载自blog.csdn.net/wudiliyao/article/details/78722514