OpenGL学习随笔(十三)

因为工作原因,有一段时间没玩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没有定义二进制的标准,所以这个工具很可能是由各厂商自己提供。

扫描二维码关注公众号,回复: 5674714 查看本文章

以下是编写一个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);
...

猜你喜欢

转载自blog.csdn.net/ison81/article/details/5374351