OpenGL(一) OpenGL管线 与 可编程管线流程


由于OpenGL是一个纯渲染核心,要写OpenGL程序,得先搭建一个外壳程序。不同平台下外壳程序的实现各有不同,这个系列的文章都在win32的平台上进行。具体实现,网上能找到很多,所以这不是本文的重点。本篇主要构建探讨 OpenGL管线 本身,具体说来,就是构建可编程管线。

主体流程

大体流程是:

  1. 在main函数中拉起外壳程序,初始化一些默认参数。例如双缓冲,32位颜色等。
  2. 创建GL上下文(HGLRC)。
  3. 加载&设置OpenGL的相关参数
  4. 在帧循环中进行绘制

至于固定管线和可编程管线,主要区别在3、4部分。固定管线是将绘制的方法写死到代码中,而可编程管线可以理解为脚本化了渲染的逻辑。不过这两者渲染的数据部分仍由编译后的程序提供。

具体说来,通过一种语法定义,将一个文本文件实例化到内存中,并且在运行时动态编译,挂载,链接到GPU程序中,完成绘制算法的替换。对应的,由于所有数据都放在内存中,绘制时,需要将它传输到GPU上,这就是缓冲区(glBuffer)。缓冲区在CPU上,会将在某些时间段内缓冲区的数据一起提交给GPU。

实现

总的来看,可编程管线动态生成了一段绘制程序,在每个GPU核心通过绘制命令,绘制传给他数据。简单的看下两部分的代码片段:

首先是创建GPU绘制程序

当GPU程序创建完成之后,就可以在主线程中写一个死循环,然后调用下面的绘制命令:

其中,绘制的顶点数据是s_shaderData.vbo,这些VBO(VertexBufferObject)数据通常在绘制之前就已准备好了。关于VBO的组成原理,我会在之后再写一篇文章详述。

GL2.0限制

由于目前市场上大多手机还是OpenGL2.0,总结了一下2.0需要注意的事项:

  • 对于支持GL2.0最差的硬件,只支持输入8个Vector4。即attribute输入的vec4不应超过8。uniform不受此限制。
  • 矩阵会占用4个vec4,因此不应使用attribute修饰mat4,应使用uniform
  • VertexShader与FragmentShader传递的变量使用varying进行标记。
  • VS里面必须给gl_Position赋值,否则无法绘制。

GLSL 例子

最简单的shader可以写成这样:

VertexShader

FragmentShader

简化看来,VertexShader处理3d的绘制信息,输出2d绘制信息。FragmentShader则是对2d信息进行色彩加工。

总结

以上就是构建 OpenGL管线 的流程。需要注意的是,一些变量需要从C++程序传入到OpenGL中。这是因为视口程序通常会提供一些动态更改这些值的方法。因此从外面传入shader会更灵活。如果在测试阶段,可以直接在shader中声明这些值,就省去了跨程序传值的烦恼。

本文出自 松阳论道 转载必须注明出处

http://blog.songyang.net/347.html

说点什么吧...

电子邮件地址不会被公开。 必填项已用*标注