OpenGL shader 程序基础

什么是 shader ?

Shader, 即渲染器,是一种类C语法的程序,用于封装硬件相关部分的代码。与普通程序的区别在于 shader 是通过GPU来执行的。

需要给GPU而不是CPU写程序的原因是GPU在处理图形相关运算时远远快于CPU。

不同的 shader 程序在使用时编译成本机硬件支持的机器指令。

shader 主要有两种:

  • 顶点渲染程序 vertex shader
  • 片断渲染程序 fragment shader,也称做像素渲染器 pixel shader

当然,不只这两种,还有很多其他的渲染器程序, 如模板渲染器,几何渲染器等等。

vertex shader 用于修改(平移,旋转,扭曲)顶点的位置: potision 和确定顶点的颜色
fragment shader 用于确定每个像素的颜色,使用照明,材质等等

编写 shader 程序

  • 编译 vertex shader,到ID
  • 编译 fragment shader,得到ID
  • 检查是否有编译错误
  • 链接以上两个 shader 程序, 得到ID

    • 保持这个ID
    • 渲染三角形时,使用这个ID
    • 不同的模型可以有不同的shader程序

举个例子

顶点渲染器 vertex shader:

in vec4 s_vPosition;
void main () {
  // 看,我不需要任何矩阵操作
  // s_vPosition 的值需要在 -1.0 和 1.0 之间
  gl_Position = s_vPosition;
}

片断渲染器 fragment shader:

out vec4 s_vColor;
void main() {
   //不管三七二十一,像素都搞成红的!
   fColor =  vec4 (1.0, 0.0, 0.0, 1.0);
}

与C语言一样,main函数是必须的入口函数。双斜杆为注释。

之所以分为这两部分程序,主要是从性能考虑:画一个三角形,顶点渲染器只调用3次,但片断渲染器(或像素渲染器)可能调用数百万次,取决于你的三角形在屏幕上显示的大小,包含多个像素。

编译渲染器

可以通过调用一些OpenGL函数来编译渲染器程序。

编译渲染器分三步: 创建id,绑定代码, 编译。

  • glCreateShader ()

    • 创建一个渲染器ID, 具有 GLuint 类型
    • GLuint ID = glCreateShader(GL_VERTEX_SHADER);
  • glShaderSource (, , , )

    • 绑定代码到渲染器程序
    • 发生在编译之前
  • glCompileShader ()

    • 编译一部分渲染器程序

创建、链接、使用渲染器

上面只是搞了一个部分渲染器,完整的程序需要再来四步:

  • glCreateProgram ()

    • 创建一个渲染器程序,返回ID, 整个程序生命周期需要保持这个ID
  • glAttachShader (, )

    • 这个调用需要分别对顶点和片断渲染器搞两次
  • glLinkProgram ()

    • 真正的链接渲染器程序
  • glUseProgram ()

    • 需要画三角形的时候使用渲染器程序

好了,就这些。详细的例子可以看这篇文章.

你可能感兴趣的:(openglshader)