因为工作原因,有一段时间没玩OpenGL了。今天开始重新拾起。这一年来接触了些OpenGL/ES的chip provider,感觉大家都开始发力了,mobile 3D产业要爆发了。
之前一直在看1.x系列,现在从2.x开始,虽然1.x还有不少内容没玩过。
2.x系列最大的变化就是引入了可编程pipeline,相对于1.x的固定pipeline来说要灵活很多,具体一点比始光照,在2.x可以做得更逼真。所谓可编程是指顶点处理和片段处理两个部分可以编程,其它部分可否编程?有没有编程的必要?这些问题还是留给高人回答吧,我只是个初学者。
可编程的器件称为shader,包括顶点(vertex)shader和片段(fragment)shader。shader的一个中文翻译是着色器。
既然是编程,那就存在语言,OpenGL定义的shader语言称为GLSL(OpenGL Shadering Language)。GLSL的语法和C差不多,GLSL提供了一些内置函数和变量用于控制OpenGL状态机。
用GLSL所写的shader代码,需要在运行时由目标机来编译,什么意思呢?就是需要在整体程序运行起来之后,在程序里调用一个函数来完成对GLSL的编译。当然,我猜想要做到静态编译是没有问题的,只是GLSL没有定义二进制的标准,所以这个工具很可能是由各厂商自己提供。
以下是编写一个2.x程序所需要做的初始化工作,与1.x类似的就不列举了,
....
1. 创建shader对象,一般要创建两个shader,即vertex shader,fragment shader
2. 将GLSL源码装载至shader
3. 编译源码
4. 创建program对象
5. 将shader与program绑定
6. 将program内的各shader链接,使program处于可执行状态
7. 将program装载至pipeline中
....
以下是上述过程所对应的源码,
...
v = glCreateShader(GL_VERTEX_SHADER);
f = glCreateShader(GL_FRAGMENT_SHADER);
//由fread将shader源码读入vv, vv是char*类型
glShaderSource(v, 1, &vv,NULL);
glShaderSource(f, 1, &ff,NULL);
glCompileShader(v);
glCompileShader(f);
p = glCreateProgram();
glAttachShader(p,v);
glAttachShader(p,f);
glLinkProgram(p);
glUseProgram(p);
...